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
|
//===----------------------------------------------------------------------===//
//
// This source file is part of the SwiftCertificates open source project
//
// Copyright (c) 2022 Apple Inc. and the SwiftCertificates project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of SwiftCertificates project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//
/// Provides a result-builder style DSL for constructing ``DistinguishedName`` values.
///
/// This DSL allows us to construct distinguished names straightforwardly, using their high-level representation instead of
/// the awkward representation provided by sequences of ``RelativeDistinguishedName`` and
/// ``RelativeDistinguishedName/Attribute``. For example, a simple ``DistinguishedName`` can be
/// provided like this:
///
/// ```swift
/// let name = try DistinguishedName {
/// CountryName("US")
/// OrganizationName("Apple Inc.")
/// CommonName("Apple Public EV Server ECC CA 1 - G1")
/// }
/// ```
///
/// Users can extend this syntax for their own extensions by conforming their semantic type to ``RelativeDistinguishedNameConvertible``.
/// This is the only requirement for adding new extensions to this builder syntax.
@resultBuilder
public struct DistinguishedNameBuilder {
@inlinable
public static func buildExpression<Extension: RelativeDistinguishedNameConvertible>(
_ expression: Extension
) -> Result<DistinguishedName, any Error> {
Result {
try DistinguishedName([expression.makeRDN()])
}
}
@inlinable
public static func buildBlock(
_ components: Result<DistinguishedName, any Error>...
) -> Result<DistinguishedName, any Error> {
Result {
DistinguishedName(try components.flatMap { try $0.get() })
}
}
@inlinable
public static func buildOptional(
_ component: Result<DistinguishedName, any Error>?
) -> Result<DistinguishedName, any Error> {
component ?? .success(DistinguishedName())
}
@inlinable
public static func buildEither(
first component: Result<DistinguishedName, any Error>
) -> Result<DistinguishedName, any Error> {
component
}
@inlinable
public static func buildEither(
second component: Result<DistinguishedName, any Error>
) -> Result<DistinguishedName, any Error> {
component
}
@inlinable
public static func buildArray(
_ components: [Result<DistinguishedName, any Error>]
) -> Result<DistinguishedName, any Error> {
Result {
DistinguishedName(try components.flatMap { try $0.get() })
}
}
@inlinable
public static func buildLimitedAvailability(
_ component: Result<DistinguishedName, any Error>
) -> Result<DistinguishedName, any Error> {
component
}
}
public protocol RelativeDistinguishedNameConvertible {
func makeRDN() throws -> RelativeDistinguishedName
}
|