60 lines
1.3 KiB
Swift
60 lines
1.3 KiB
Swift
import Rainbow
|
|
|
|
public extension Group {
|
|
func labelColor(_ color: NamedColor) -> some Node {
|
|
modifier(GroupLabelModifier(color: color))
|
|
}
|
|
}
|
|
|
|
public extension Node where Self.Body == Group {
|
|
func labelColor(_ color: NamedColor) -> some Node {
|
|
body.modifier(GroupLabelModifier(color: color))
|
|
}
|
|
}
|
|
|
|
public extension Node where Self == Label {
|
|
func labelColor(_ color: NamedColor) -> some Node {
|
|
modifier(LabelColorModifier(color: color))
|
|
}
|
|
}
|
|
|
|
public extension Note where Label == CliDoc.Label {
|
|
func labelColor(_ color: NamedColor) -> some Node {
|
|
var node = self
|
|
node.label.color = color
|
|
return node
|
|
}
|
|
}
|
|
|
|
struct LabelColorModifier: NodeModifier {
|
|
let color: NamedColor
|
|
|
|
func render(content: Label) -> some Node {
|
|
var label = content
|
|
label.color = color
|
|
return label
|
|
}
|
|
}
|
|
|
|
struct GroupLabelModifier: NodeModifier {
|
|
let color: NamedColor
|
|
|
|
func render(content: Group) -> some Node {
|
|
var group = content
|
|
applyLabelColor(&group)
|
|
return group
|
|
}
|
|
|
|
private func applyLabelColor(_ group: inout Group) {
|
|
for (idx, node) in group.nodes.enumerated() {
|
|
if var label = node as? Label {
|
|
label.color = color
|
|
group.nodes[idx] = label
|
|
} else if var nestedGroup = node as? Group {
|
|
applyLabelColor(&nestedGroup)
|
|
group.nodes[idx] = nestedGroup
|
|
}
|
|
}
|
|
}
|
|
}
|