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
|
/*
This source file is part of the Swift.org open source project
Copyright (c) 2021-2024 Apple Inc. and the Swift project authors
Licensed under Apache License v2.0 with Runtime Library Exception
See https://swift.org/LICENSE.txt for license information
See https://swift.org/CONTRIBUTORS.txt for Swift project authors
*/
import Foundation
/// A utility type to apply variant overrides to an encoded render node.
public struct RenderNodeVariantOverridesApplier {
/// Creates a variant overrides applier.
public init() {}
/// Applies variant overrides of the given trait to the given encoded render node.
/// - Parameters:
/// - renderNodeData: The render node on which to apply the variant override, encoded in JSON.
/// - traits: The traits associated with the patch to apply.
/// - Returns: The render node with the patch applied, encoded in JSON.
public func applyVariantOverrides(in renderNodeData: Data, for traits: [RenderNode.Variant.Trait]) throws -> Data {
let variantOverrides = try JSONDecoder().decode(
RenderNodeVariantsProxy.self,
from: renderNodeData
).variantOverrides
guard let patch = variantOverrides?.values.first(where: { $0.traits == traits })?.patch else {
return renderNodeData
}
// Remove the `variantOverrides` property of the render node.
let removeVariantOverridesPatch = JSONPatchOperation.remove(
pointer: JSONPointer(pathComponents: ["variantOverrides"])
)
return try JSONPatchApplier().apply(patch + [removeVariantOverridesPatch], to: renderNodeData)
}
/// A proxy type for decoding only the variant overrides of a render node.
private struct RenderNodeVariantsProxy: Codable {
var variantOverrides: VariantOverrides?
}
@available(*, deprecated, message: "This error is never raised. This deprecated API will be removed after 5.11 is released")
public enum Error: DescribedError {
case corruptedRenderNode
public var errorDescription: String {
switch self {
case .corruptedRenderNode:
return "Corrupted or malformed render node value."
}
}
}
}
|