Add basic Docs.md
This commit is contained in:
parent
d8ed52cff5
commit
997e8de884
|
@ -0,0 +1,209 @@
|
|||
# Yams Documentation
|
||||
|
||||
For installation instructions, see [README.md](README.md).
|
||||
|
||||
API documentation coming soon.
|
||||
|
||||
## Usage
|
||||
|
||||
### Consume YAML
|
||||
|
||||
Here's a simple example parsing a YAML array of strings:
|
||||
|
||||
```swift
|
||||
import Yams
|
||||
|
||||
let yamlString = """
|
||||
- a
|
||||
- b
|
||||
- c
|
||||
"""
|
||||
do {
|
||||
let yamlNode = try Yams.load(yaml: yamlString)
|
||||
if let yamlArray = yamlNode as? [String] {
|
||||
print(yamlArray)
|
||||
}
|
||||
} catch {
|
||||
print("handle error: \(error)")
|
||||
}
|
||||
|
||||
// Prints:
|
||||
// ["a", "b", "c"]
|
||||
```
|
||||
|
||||
### Emit YAML
|
||||
|
||||
Here's a simple example emitting YAML string from a Swift `Array<String>`:
|
||||
|
||||
```swift
|
||||
import Yams
|
||||
|
||||
do {
|
||||
let yamlString = try Yams.serialize(node: ["a", "b", "c"])
|
||||
print(yamlString)
|
||||
} catch {
|
||||
print("handle error: \(error)")
|
||||
}
|
||||
|
||||
// Prints:
|
||||
// - a
|
||||
// - b
|
||||
// - c
|
||||
```
|
||||
|
||||
You can even customize the style:
|
||||
|
||||
```swift
|
||||
import Yams
|
||||
|
||||
var node: Node = ["a", "b", "c"]
|
||||
node.sequence?.style = .flow
|
||||
|
||||
do {
|
||||
let yamlString = try Yams.serialize(node: node)
|
||||
print(yamlString)
|
||||
} catch {
|
||||
print("handle error: \(error)")
|
||||
}
|
||||
|
||||
// Prints:
|
||||
// [a, b, c]
|
||||
```
|
||||
|
||||
### Customize Parsing
|
||||
|
||||
For example, say you only want the literals `true` and `false` to represent booleans, unlike the
|
||||
YAML spec compliant boolean which also includes `on`/`off` and many others.
|
||||
|
||||
You can customize Yams' Constructor map:
|
||||
|
||||
```swift
|
||||
import Yams
|
||||
|
||||
extension Constructor {
|
||||
public static func withBoolAsTrueFalse() -> Constructor {
|
||||
var map = defaultMap
|
||||
map[.bool] = Bool.constructUsingOnlyTrueAndFalse
|
||||
return Constructor(map)
|
||||
}
|
||||
}
|
||||
|
||||
private extension Bool {
|
||||
static func constructUsingOnlyTrueAndFalse(from node: Node) -> Bool? {
|
||||
assert(node.isScalar)
|
||||
switch node.scalar!.string.lowercased() {
|
||||
case "true":
|
||||
return true
|
||||
case "false":
|
||||
return false
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private extension Node {
|
||||
var isScalar: Bool {
|
||||
if case .scalar = self {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
// Usage:
|
||||
|
||||
let yamlString = """
|
||||
- true
|
||||
- on
|
||||
- off
|
||||
- false
|
||||
"""
|
||||
if let array = try? Yams.load(yaml: yamlString, .default, .withBoolAsTrueFalse()) as? [Any] {
|
||||
print(array)
|
||||
}
|
||||
|
||||
// Prints:
|
||||
// [true, "on", "off", false]
|
||||
```
|
||||
|
||||
### Expanding Environment Variables
|
||||
|
||||
For example:
|
||||
|
||||
```swift
|
||||
import Yams
|
||||
|
||||
extension Constructor {
|
||||
public static func withEnv(_ env: [String: String]) -> Constructor {
|
||||
var map = defaultMap
|
||||
map[.str] = String.constructExpandingEnvVars(env: env)
|
||||
return Constructor(map)
|
||||
}
|
||||
}
|
||||
|
||||
private extension String {
|
||||
static func constructExpandingEnvVars(env: [String: String]) -> (_ node: Node) -> String? {
|
||||
return { (node: Node) -> String? in
|
||||
assert(node.isScalar)
|
||||
return node.scalar!.string.expandingEnvVars(env: env)
|
||||
}
|
||||
}
|
||||
|
||||
func expandingEnvVars(env: [String: String]) -> String {
|
||||
var result = self
|
||||
for (key, value) in env {
|
||||
result = result.replacingOccurrences(of: "${\(key)}", with: value)
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
}
|
||||
|
||||
// Usage:
|
||||
|
||||
let yamlString = """
|
||||
- first
|
||||
- ${SECOND}
|
||||
- SECOND
|
||||
"""
|
||||
let env = ["SECOND": "2"]
|
||||
if let array = try? Yams.load(yaml: yamlString, .default, .withEnv(env)) as? [String] {
|
||||
print(array)
|
||||
}
|
||||
|
||||
// Prints:
|
||||
// ["first", "2", "SECOND"]
|
||||
```
|
||||
|
||||
### Converting Between Formats
|
||||
|
||||
Because Yams conforms to Swift 4's Codable protocol and provides a YAML Encoder and Decoder,
|
||||
you can easily convert between YAML and other formats that also provide Swift 4 Encoders and
|
||||
Decoders, such as JSON and Plist.
|
||||
|
||||
### Error Handling
|
||||
|
||||
Failable operations in Yams throw Swift errors.
|
||||
|
||||
### Types
|
||||
|
||||
| Name | Yams Tag | YAML Tag | Swift Types |
|
||||
|----------------|---------------|-------------------------------|--------------------------------|
|
||||
| ... | `implicit` | `` | ... |
|
||||
| ... | `nonSpecific` | `!` | ... |
|
||||
| String | `str` | `tag:yaml.org,2002:str` | `String` |
|
||||
| Sequence | `seq` | `tag:yaml.org,2002:seq` | `Array<Any>` |
|
||||
| Map | `map` | `tag:yaml.org,2002:map` | `Dictionary<AnyHashable, Any>` |
|
||||
| Boolean | `bool` | `tag:yaml.org,2002:bool` | `Bool` |
|
||||
| Floating Point | `float` | `tag:yaml.org,2002:float` | ... |
|
||||
| Null | `null` | `tag:yaml.org,2002:null` | `Void` |
|
||||
| Integer | `int` | `tag:yaml.org,2002:int` | `FixedWidthInteger` |
|
||||
| ... | `binary` | `tag:yaml.org,2002:binary` | `Data` |
|
||||
| ... | `merge` | `tag:yaml.org,2002:merge` | ... |
|
||||
| ... | `omap` | `tag:yaml.org,2002:omap` | ... |
|
||||
| ... | `pairs` | `tag:yaml.org,2002:pairs` | ... |
|
||||
| Set | `set` | `tag:yaml.org,2002:set` | `Set<AnyHashable>` |
|
||||
| Timestamp | `timestamp` | `tag:yaml.org,2002:timestamp` | `Date` |
|
||||
| ... | `value` | `tag:yaml.org,2002:value` | ... |
|
||||
| YAML | `yaml` | `tag:yaml.org,2002:yaml` | Unsupported |
|
Loading…
Reference in New Issue