File: RenderNodeVariantOverridesApplier.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (56 lines) | stat: -rw-r--r-- 2,287 bytes parent folder | download
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."
            }
        }
    }
}