Yams

Yams

一个基于 LibYAML 构建的快速且简洁的 YAML 解析器。

SwiftPM xcodebuild pod lib lint Nightly codecov

安装

构建 Yams 需要 Xcode 14.0+ 或 Swift 5.7+ 工具链,并使用 Swift Package Manager 或 CMake 和 Ninja。

CMake

需要 CMake 3.17.2 或更高版本,以及 Ninja 1.9.0 或更高版本。

为非 Apple 平台构建时

cmake -B /path/to/build -G Ninja -S /path/to/yams -DCMAKE_BUILD_TYPE=Release -DFoundation_DIR=/path/to/foundation/build/cmake/modules
cmake --build /path/to/build

为 Apple 平台(macOS、iOS、tvOS、watchOS)构建时,无需单独构建 Foundation,因为它包含在 SDK 中

cmake -B /path/to/build -G Ninja -S /path/to/yams -DCMAKE_BUILD_TYPE=Release
cmake --build /path/to/build

Swift Package Manager

.package(url: "https://github.com/jpsim/Yams.git", from: "5.1.3") 添加到您的 Package.swift 文件的 dependencies 中。

CocoaPods

pod 'Yams' 添加到您的 Podfile 中。

Carthage

github "jpsim/Yams" 添加到您的 Cartfile 中。

Bazel

在您的 WORKSPACE 文件中

YAMS_GIT_SHA = "SOME_SHA"
http_archive(
    name = "com_github_jpsim_yams",
    urls = [
        "https://github.com/jpsim/Yams/archive/%s.zip" % YAMS_GIT_SHA,
    ],
    strip_prefix = "Yams-%s" % YAMS_GIT_SHA,
)

用法

Yams 具有三组转换 API:一组用于 Codable 类型,另一组用于 Swift 标准库类型,第三组用于 Yams 原生表示。

Codable 类型

import Foundation
import Yams

struct S: Codable {
    var p: String
}

let s = S(p: "test")
let encoder = YAMLEncoder()
let encodedYAML = try encoder.encode(s)
encodedYAML == """
p: test

"""
let decoder = YAMLDecoder()
let decoded = try decoder.decode(S.self, from: encodedYAML)
s.p == decoded.p

Swift 标准库类型

// [String: Any]
let dictionary: [String: Any] = ["key": "value"]
let mapYAML: String = try Yams.dump(object: dictionary)
mapYAML == """
key: value

"""
let loadedDictionary = try Yams.load(yaml: mapYAML) as? [String: Any]

// [Any]
let array: [Int] = [1, 2, 3]
let sequenceYAML: String = try Yams.dump(object: array)
sequenceYAML == """
- 1
- 2
- 3

"""
let loadedArray: [Int]? = try Yams.load(yaml: sequenceYAML) as? [Int]

// Any
let string = "string"
let scalarYAML: String = try Yams.dump(object: string)
scalarYAML == """
string

"""
let loadedString: String? = try Yams.load(yaml: scalarYAML) as? String

Yams.Node

var map: Yams.Node = [
    "array": [
        1, 2, 3
    ]
]
map.mapping?.style = .flow
map["array"]?.sequence?.style = .flow
let yaml = try Yams.serialize(node: map)
yaml == """
{array: [1, 2, 3]}

"""
let node = try Yams.compose(yaml: yaml)
map == node

Combine 集成

当 Apple 的 Combine 框架可用时,YAMLDecoder 符合 TopLevelDecoder 协议,这允许它与 decode(type:decoder:) 运算符一起使用

import Combine
import Foundation
import Yams

func fetchBook(from url: URL) -> AnyPublisher<Book, Error> {
    URLSession.shared.dataTaskPublisher(for: url)
        .map(\.data)
        .decode(type: Book.self, decoder: YAMLDecoder())
        .eraseToAnyPublisher()
}

许可证

Yams 和 libYAML 均已获得 MIT 许可。