Skip to content

Commit fd9683b

Browse files
authored
Merge pull request #81 from onevcat/feature/conditional-styling
Add comprehensive conditional styling feature
2 parents fb100fe + 7f76071 commit fd9683b

File tree

2 files changed

+78
-0
lines changed

2 files changed

+78
-0
lines changed

README.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,60 @@ print("最是一年春好处,绝胜烟柳满皇都".hsl(90, 60, 70))
163163

164164
> Format: `hue` (0-360°), `saturation` (0-100%), `lightness` (0-100%)
165165
166+
### Conditional Styling
167+
168+
Rainbow supports conditional styling that allows you to apply colors and styles based on runtime conditions, making your code more readable and reducing the need for ternary operators:
169+
170+
```swift
171+
// Basic conditional styling
172+
let isError = true
173+
let isWarning = false
174+
175+
print("Error occurred".colorIf(isError, .red).styleIf(isError, .bold))
176+
print("Warning message".colorIf(isWarning, .yellow))
177+
178+
// Log level styling
179+
enum LogLevel { case error, warning, info }
180+
let level = LogLevel.error
181+
let message = "Something happened"
182+
183+
print(message
184+
.colorIf(level == .error, .red)
185+
.colorIf(level == .warning, .yellow)
186+
.colorIf(level == .info, .cyan)
187+
.styleIf(level == .error, .bold))
188+
```
189+
190+
#### Advanced Conditional Builder
191+
192+
For more complex conditional styling scenarios, use the fluent builder interface:
193+
194+
```swift
195+
let isActive = true
196+
let isWarning = false
197+
let isError = false
198+
199+
let styledText = "Server Status: Running"
200+
.conditionalStyled
201+
.when(isActive).green.bold
202+
.when(isWarning).yellow
203+
.when(isError).red.underline
204+
.build()
205+
206+
print(styledText)
207+
208+
// With closure-based conditions
209+
let progress = 75
210+
let statusMessage = "Processing..."
211+
.conditionalStyled
212+
.when { progress < 33 }.red.italic
213+
.when { progress >= 33 && progress < 67 }.yellow
214+
.when { progress >= 67 }.green.bold
215+
.build()
216+
217+
print(statusMessage)
218+
```
219+
166220
### Output Target
167221

168222
By default, Rainbow should be smart enough to detect the output target, to determine if it is a tty. For example, it

Rainbow.xcodeproj/project.pbxproj

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,15 @@
5353
D13C24CA2E20FC16000690E1 /* StyledStringBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D13C24C92E20FC16000690E1 /* StyledStringBuilderTests.swift */; };
5454
D16B37C41C2A2F76001A5D35 /* OutputTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = D16B37C31C2A2F76001A5D35 /* OutputTarget.swift */; };
5555
D17B42F025E891D5002914A0 /* ConsoleTextParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D17B42EF25E891D5002914A0 /* ConsoleTextParserTests.swift */; };
56+
D1A960852E2A70AD00AEB552 /* String+ConditionalStyling.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1A960842E2A70AD00AEB552 /* String+ConditionalStyling.swift */; };
57+
D1A960862E2A70AD00AEB552 /* String+ConditionalStyling.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1A960842E2A70AD00AEB552 /* String+ConditionalStyling.swift */; };
58+
D1A960872E2A70AD00AEB552 /* String+ConditionalStyling.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1A960842E2A70AD00AEB552 /* String+ConditionalStyling.swift */; };
59+
D1A960882E2A70AD00AEB552 /* String+ConditionalStyling.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1A960842E2A70AD00AEB552 /* String+ConditionalStyling.swift */; };
60+
D1A9608A2E2A70C700AEB552 /* ConditionalStyleBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1A960892E2A70C700AEB552 /* ConditionalStyleBuilder.swift */; };
61+
D1A9608B2E2A70C700AEB552 /* ConditionalStyleBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1A960892E2A70C700AEB552 /* ConditionalStyleBuilder.swift */; };
62+
D1A9608C2E2A70C700AEB552 /* ConditionalStyleBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1A960892E2A70C700AEB552 /* ConditionalStyleBuilder.swift */; };
63+
D1A9608D2E2A70C700AEB552 /* ConditionalStyleBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1A960892E2A70C700AEB552 /* ConditionalStyleBuilder.swift */; };
64+
D1A9608F2E2A710600AEB552 /* ConditionalStylingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1A9608E2E2A710600AEB552 /* ConditionalStylingTests.swift */; };
5665
D1A98FAF1C299D64000DDF20 /* String+Rainbow.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1A98FAE1C299D63000DDF20 /* String+Rainbow.swift */; };
5766
D1A98FB11C299DF0000DDF20 /* ConsoleStringTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1A98FB01C299DF0000DDF20 /* ConsoleStringTests.swift */; };
5867
D1B428BF25F1BE56009F1DD1 /* ColorApproximation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1B428BE25F1BE56009F1DD1 /* ColorApproximation.swift */; };
@@ -101,6 +110,9 @@
101110
D13C24C92E20FC16000690E1 /* StyledStringBuilderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = StyledStringBuilderTests.swift; path = RainbowTests/StyledStringBuilderTests.swift; sourceTree = "<group>"; };
102111
D16B37C31C2A2F76001A5D35 /* OutputTarget.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OutputTarget.swift; sourceTree = "<group>"; };
103112
D17B42EF25E891D5002914A0 /* ConsoleTextParserTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = ConsoleTextParserTests.swift; path = RainbowTests/ConsoleTextParserTests.swift; sourceTree = "<group>"; };
113+
D1A960842E2A70AD00AEB552 /* String+ConditionalStyling.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+ConditionalStyling.swift"; sourceTree = "<group>"; };
114+
D1A960892E2A70C700AEB552 /* ConditionalStyleBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConditionalStyleBuilder.swift; sourceTree = "<group>"; };
115+
D1A9608E2E2A710600AEB552 /* ConditionalStylingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = ConditionalStylingTests.swift; path = RainbowTests/ConditionalStylingTests.swift; sourceTree = "<group>"; };
104116
D1A98FAE1C299D63000DDF20 /* String+Rainbow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+Rainbow.swift"; sourceTree = "<group>"; };
105117
D1A98FB01C299DF0000DDF20 /* ConsoleStringTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ConsoleStringTests.swift; path = Tests/RainbowTests/ConsoleStringTests.swift; sourceTree = SOURCE_ROOT; };
106118
D1B428BE25F1BE56009F1DD1 /* ColorApproximation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorApproximation.swift; sourceTree = "<group>"; };
@@ -181,6 +193,7 @@
181193
4BC8219E1C29276C00F68E70 /* Info.plist */,
182194
4BC8219F1C29276C00F68E70 /* RainbowTests.swift */,
183195
D118F24E25EF13B700C7B074 /* ColorTests.swift */,
196+
D1A9608E2E2A710600AEB552 /* ConditionalStylingTests.swift */,
184197
D17B42EF25E891D5002914A0 /* ConsoleTextParserTests.swift */,
185198
D1A98FB01C299DF0000DDF20 /* ConsoleStringTests.swift */,
186199
D1B428C825F1CBA0009F1DD1 /* ColorApproximatedTests.swift */,
@@ -203,6 +216,8 @@
203216
4BC821A91C2928CF00F68E70 /* Sources */ = {
204217
isa = PBXGroup;
205218
children = (
219+
D1A960842E2A70AD00AEB552 /* String+ConditionalStyling.swift */,
220+
D1A960892E2A70C700AEB552 /* ConditionalStyleBuilder.swift */,
206221
D1F077282E27C68100EF60B9 /* HSLColorConverter.swift */,
207222
D13C24C22E20F8A7000690E1 /* StyledStringBuilder.swift */,
208223
D1C5D8DB1C2ACA1D001CB619 /* CodesParser.swift */,
@@ -411,11 +426,13 @@
411426
4B1929191C2BBC98005B79AB /* CodesParser.swift in Sources */,
412427
4B19291A1C2BBC98005B79AB /* ModesExtractor.swift in Sources */,
413428
D13C24C52E20F8A7000690E1 /* StyledStringBuilder.swift in Sources */,
429+
D1A960852E2A70AD00AEB552 /* String+ConditionalStyling.swift in Sources */,
414430
4B19291B1C2BBC98005B79AB /* StringGenerator.swift in Sources */,
415431
4B19291C1C2BBC98005B79AB /* Rainbow.swift in Sources */,
416432
4B19291D1C2BBC98005B79AB /* Color.swift in Sources */,
417433
4B19291E1C2BBC98005B79AB /* BackgroundColor.swift in Sources */,
418434
4B19291F1C2BBC98005B79AB /* Style.swift in Sources */,
435+
D1A9608A2E2A70C700AEB552 /* ConditionalStyleBuilder.swift in Sources */,
419436
4B1929201C2BBC98005B79AB /* ControlCode.swift in Sources */,
420437
4B1929211C2BBC98005B79AB /* String+Rainbow.swift in Sources */,
421438
4B1929221C2BBC98005B79AB /* OutputTarget.swift in Sources */,
@@ -431,11 +448,13 @@
431448
4B1929311C2BBE06005B79AB /* CodesParser.swift in Sources */,
432449
4B1929321C2BBE06005B79AB /* ModesExtractor.swift in Sources */,
433450
D13C24C62E20F8A7000690E1 /* StyledStringBuilder.swift in Sources */,
451+
D1A960862E2A70AD00AEB552 /* String+ConditionalStyling.swift in Sources */,
434452
4B1929331C2BBE06005B79AB /* StringGenerator.swift in Sources */,
435453
4B1929341C2BBE06005B79AB /* Rainbow.swift in Sources */,
436454
4B1929351C2BBE06005B79AB /* Color.swift in Sources */,
437455
4B1929361C2BBE06005B79AB /* BackgroundColor.swift in Sources */,
438456
4B1929371C2BBE06005B79AB /* Style.swift in Sources */,
457+
D1A9608D2E2A70C700AEB552 /* ConditionalStyleBuilder.swift in Sources */,
439458
4B1929381C2BBE06005B79AB /* ControlCode.swift in Sources */,
440459
4B1929391C2BBE06005B79AB /* String+Rainbow.swift in Sources */,
441460
4B19293A1C2BBE06005B79AB /* OutputTarget.swift in Sources */,
@@ -451,11 +470,13 @@
451470
4B19295A1C2BBEFE005B79AB /* CodesParser.swift in Sources */,
452471
4B19295B1C2BBEFE005B79AB /* ModesExtractor.swift in Sources */,
453472
D13C24C42E20F8A7000690E1 /* StyledStringBuilder.swift in Sources */,
473+
D1A960872E2A70AD00AEB552 /* String+ConditionalStyling.swift in Sources */,
454474
4B19295C1C2BBEFE005B79AB /* StringGenerator.swift in Sources */,
455475
4B19295D1C2BBEFE005B79AB /* Rainbow.swift in Sources */,
456476
4B19295E1C2BBEFE005B79AB /* Color.swift in Sources */,
457477
4B19295F1C2BBEFE005B79AB /* BackgroundColor.swift in Sources */,
458478
4B1929601C2BBEFE005B79AB /* Style.swift in Sources */,
479+
D1A9608C2E2A70C700AEB552 /* ConditionalStyleBuilder.swift in Sources */,
459480
4B1929611C2BBEFE005B79AB /* ControlCode.swift in Sources */,
460481
4B1929621C2BBEFE005B79AB /* String+Rainbow.swift in Sources */,
461482
4B1929631C2BBEFE005B79AB /* OutputTarget.swift in Sources */,
@@ -471,11 +492,13 @@
471492
4BC026EB1C292B25009FD2FD /* ControlCode.swift in Sources */,
472493
4BC026ED1C292F5C009FD2FD /* BackgroundColor.swift in Sources */,
473494
D13C24C32E20F8A7000690E1 /* StyledStringBuilder.swift in Sources */,
495+
D1A960882E2A70AD00AEB552 /* String+ConditionalStyling.swift in Sources */,
474496
4BC026E91C2929E7009FD2FD /* Color.swift in Sources */,
475497
D1A98FAF1C299D64000DDF20 /* String+Rainbow.swift in Sources */,
476498
D1C5D8E01C2AD38A001CB619 /* StringGenerator.swift in Sources */,
477499
D16B37C41C2A2F76001A5D35 /* OutputTarget.swift in Sources */,
478500
D1C5D8DC1C2ACA1D001CB619 /* CodesParser.swift in Sources */,
501+
D1A9608B2E2A70C700AEB552 /* ConditionalStyleBuilder.swift in Sources */,
479502
D1C5D8DE1C2ACA7A001CB619 /* ModesExtractor.swift in Sources */,
480503
4BA75FAA1C2939EC00B1037A /* Rainbow.swift in Sources */,
481504
4BC026EF1C292F70009FD2FD /* Style.swift in Sources */,
@@ -496,6 +519,7 @@
496519
D13C24CA2E20FC16000690E1 /* StyledStringBuilderTests.swift in Sources */,
497520
D1A98FB11C299DF0000DDF20 /* ConsoleStringTests.swift in Sources */,
498521
4BC821A11C29276C00F68E70 /* RainbowTests.swift in Sources */,
522+
D1A9608F2E2A710600AEB552 /* ConditionalStylingTests.swift in Sources */,
499523
);
500524
runOnlyForDeploymentPostprocessing = 0;
501525
};

0 commit comments

Comments
 (0)