forked from Carthage/Carthage
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Formatting.swift
96 lines (78 loc) · 2.74 KB
/
Formatting.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
//
// Formatting.swift
// Carthage
//
// Created by J.D. Healy on 1/29/15.
// Copyright (c) 2015 Carthage. All rights reserved.
//
import CarthageKit
import Commandant
import Foundation
import Result
import PrettyColors
/// Wraps a string with terminal colors and formatting or passes it through, depending on `colorful`.
private func wrap(colorful: Bool)(wrap: Color.Wrap)(string: String) -> String {
return colorful ? wrap.wrap(string) : string
}
/// Argument for whether to color and format terminal output.
public enum ColorArgument: String, ArgumentType, Printable {
case Auto = "auto"
case Never = "never"
case Always = "always"
/// Whether to color and format.
public var isColorful: Bool {
switch self {
case .Always:
return true
case .Never:
return false
case .Auto:
return Terminal.isTTY && !Terminal.isDumb
}
}
public var description: String {
return self.rawValue
}
public static let name = "color"
public static func fromString(string: String) -> ColorArgument? {
return self(rawValue: string.lowercaseString)
}
}
/// Options for whether to color and format terminal output.
public struct ColorOptions: OptionsType {
let argument: ColorArgument
let formatting: Formatting
public struct Formatting {
let colorful: Bool
/// Wraps a string with terminal colors and formatting or passes it through.
typealias Wrap = (string: String) -> String
init(_ colorful: Bool) {
self.colorful = colorful
bulletin = wrap(colorful)(wrap: Color.Wrap(foreground: .Blue, style: .Bold))
bullets = self.bulletin(string: "***") + " "
URL = wrap(colorful)(wrap: Color.Wrap(styles: .Underlined))
projectName = wrap(colorful)(wrap: Color.Wrap(styles: .Bold))
path = wrap(colorful)(wrap: Color.Wrap(foreground: .Yellow))
}
let bulletin: Wrap
let bullets: String
/// Wraps a string in bullets, one space of padding, and formatting.
func bulletinTitle(string: String) -> String {
return bulletin(string: "*** " + string + " ***")
}
let URL: Wrap
let projectName: Wrap
let path: Wrap
/// Wraps a string in quotation marks and formatting.
func quote(string: String, quotationMark: String = "\"") -> String {
return wrap(colorful)(wrap: Color.Wrap(foreground: .Green))(string: quotationMark + string + quotationMark)
}
}
public static func create(argument: ColorArgument) -> ColorOptions {
return self(argument: argument, formatting: Formatting(argument.isColorful))
}
public static func evaluate(m: CommandMode) -> Result<ColorOptions, CommandantError<CarthageError>> {
return create
<*> m <| Option(key: "color", defaultValue: ColorArgument.Auto, usage: "whether to apply color and terminal formatting (one of ‘auto’, ‘always’, or ‘never’)")
}
}