|
8 | 8 |
|
9 | 9 | import Foundation
|
10 | 10 |
|
| 11 | +/// Class used to resolve nodes to tags based on customizable rules. |
11 | 12 | public final class Resolver {
|
| 13 | + /// Rule describing how to resolve tags from regex patterns. |
12 | 14 | public struct Rule {
|
| 15 | + /// The tag name this rule applies to. |
13 | 16 | public let tag: Tag.Name
|
14 |
| - let regexp: NSRegularExpression |
| 17 | + internal let regexp: NSRegularExpression |
| 18 | + /// The regex pattern used to resolve this rule. |
15 | 19 | public var pattern: String { return regexp.pattern }
|
16 | 20 |
|
| 21 | + /// Create a rule with the specified tag name and regex pattern. |
| 22 | + /// |
| 23 | + /// - parameter tag: The tag name this rule should apply to. |
| 24 | + /// - parameter pattern: The regex pattern used to resolve this rule. |
| 25 | + /// |
| 26 | + /// - throws: Throws an error if the regular expression pattern is invalid. |
17 | 27 | public init(_ tag: Tag.Name, _ pattern: String) throws {
|
18 | 28 | self.tag = tag
|
19 | 29 | self.regexp = try .init(pattern: pattern, options: [])
|
20 | 30 | }
|
21 | 31 | }
|
22 | 32 |
|
| 33 | + /// The rules used by this resolver to resolve nodes to tags. |
23 | 34 | public let rules: [Rule]
|
24 | 35 |
|
25 |
| - init(_ rules: [Rule] = []) { self.rules = rules } |
| 36 | + internal init(_ rules: [Rule] = []) { self.rules = rules } |
26 | 37 |
|
| 38 | + /// Resolve a tag name from a given node. |
| 39 | + /// |
| 40 | + /// - parameter node: Node whose tag should be resolved. |
| 41 | + /// |
| 42 | + /// - returns: The resolved tag name. |
27 | 43 | public func resolveTag(of node: Node) -> Tag.Name {
|
28 | 44 | switch node {
|
29 | 45 | case let .scalar(scalar):
|
@@ -74,52 +90,68 @@ public final class Resolver {
|
74 | 90 | }
|
75 | 91 | }
|
76 | 92 |
|
| 93 | +// MARK: Defaults |
| 94 | + |
77 | 95 | extension Resolver {
|
| 96 | + /// Resolver with no rules. |
78 | 97 | public static let basic = Resolver()
|
| 98 | + /// Resolver with a default set of rules rules. |
79 | 99 | public static let `default` = Resolver([.bool, .int, .float, .merge, .null, .timestamp, .value])
|
80 | 100 | }
|
81 | 101 |
|
| 102 | +// MARK: Default Resolver Rules |
| 103 | + |
82 | 104 | extension Resolver.Rule {
|
83 |
| - // swiftlint:disable:next force_try |
| 105 | + // swiftlint:disable force_try |
| 106 | + |
| 107 | + /// Default bool resolver rule. |
84 | 108 | public static let bool = try! Resolver.Rule(.bool, """
|
85 | 109 | ^(?:yes|Yes|YES|no|No|NO\
|
86 | 110 | |true|True|TRUE|false|False|FALSE\
|
87 | 111 | |on|On|ON|off|Off|OFF)$
|
88 | 112 | """)
|
89 |
| - // swiftlint:disable:next force_try |
| 113 | + |
| 114 | + /// Default int resolver rule. |
90 | 115 | public static let int = try! Resolver.Rule(.int, """
|
91 | 116 | ^(?:[-+]?0b[0-1_]+\
|
92 | 117 | |[-+]?0o?[0-7_]+\
|
93 | 118 | |[-+]?(?:0|[1-9][0-9_]*)\
|
94 | 119 | |[-+]?0x[0-9a-fA-F_]+\
|
95 | 120 | |[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)$
|
96 | 121 | """)
|
97 |
| - // swiftlint:disable:next force_try |
| 122 | + |
| 123 | + /// Default float resolver rule. |
98 | 124 | public static let float = try! Resolver.Rule(.float, """
|
99 | 125 | ^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?\
|
100 | 126 | |\\.[0-9_]+(?:[eE][-+][0-9]+)?\
|
101 | 127 | |[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*\
|
102 | 128 | |[-+]?\\.(?:inf|Inf|INF)\
|
103 | 129 | |\\.(?:nan|NaN|NAN))$
|
104 | 130 | """)
|
105 |
| - // swiftlint:disable:next force_try |
| 131 | + |
| 132 | + /// Default merge resolver rule. |
106 | 133 | public static let merge = try! Resolver.Rule(.merge, "^(?:<<)$")
|
107 |
| - // swiftlint:disable:next force_try |
| 134 | + |
| 135 | + /// Default null resolver rule. |
108 | 136 | public static let null = try! Resolver.Rule(.null, """
|
109 | 137 | ^(?:~\
|
110 | 138 | |null|Null|NULL\
|
111 | 139 | |)$
|
112 | 140 | """)
|
113 |
| - // swiftlint:disable:next force_try |
| 141 | + |
| 142 | + /// Default timestamp resolver rule. |
114 | 143 | public static let timestamp = try! Resolver.Rule(.timestamp, """
|
115 | 144 | ^(?:[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\
|
116 | 145 | |[0-9][0-9][0-9][0-9]-[0-9][0-9]?-[0-9][0-9]?\
|
117 | 146 | (?:[Tt]|[ \\t]+)[0-9][0-9]?\
|
118 | 147 | :[0-9][0-9]:[0-9][0-9](?:\\.[0-9]*)?\
|
119 | 148 | (?:[ \\t]*(?:Z|[-+][0-9][0-9]?(?::[0-9][0-9])?))?)$
|
120 | 149 | """)
|
121 |
| - // swiftlint:disable:next force_try |
| 150 | + |
| 151 | + /// Default value resolver rule. |
122 | 152 | public static let value = try! Resolver.Rule(.value, "^(?:=)$")
|
| 153 | + |
| 154 | + // swiftlint:enable force_try |
123 | 155 | }
|
124 | 156 |
|
125 | 157 | func pattern(_ string: String) -> NSRegularExpression {
|
|
0 commit comments