File: FileReference.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 (136 lines) | stat: -rw-r--r-- 5,789 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
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
 This source file is part of the Swift.org open source project

 Copyright (c) 2021-2023 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 reference to a file resource.
///
/// File resources are used, for example, to display the contents of a source code file in a Tutorial's step.
public struct FileReference: RenderReference, Equatable {
    /// The type of this file reference.
    ///
    /// This value is always `.file`.
    public var type: RenderReferenceType = .file
    
    /// The identifier of this reference.
    public var identifier: RenderReferenceIdentifier
    
    /// The name of the file.
    public var fileName: String
    
    /// The type of the file, typically represented by its file extension.
    public var fileType: String
    
    /// The syntax for the content in the file, for example "swift".
    ///
    /// You can use this value to identify the syntax of the content. This would allow, for example, a renderer to perform syntax highlighting of the file's content.
    public var syntax: String
    
    /// The line-by-line contents of the file.
    public var content: [String]
    
    /// The line highlights for this file.
    public var highlights: [LineHighlighter.Highlight] = []
    
    /// Creates a new file reference.
    ///
    /// - Parameters:
    ///   - identifier: The identifier for this file reference.
    ///   - fileName: The name of the references file.
    ///   - fileType: The type of file, typically represented by its file extension.
    ///   - syntax: The syntax of the file's content.
    ///   - content: The line-by-line contents of the file.
    ///   - highlights: The line highlights for this file.
    public init(
        identifier: RenderReferenceIdentifier,
        fileName: String,
        fileType: String,
        syntax: String,
        content: [String],
        highlights: [LineHighlighter.Highlight] = []
    ) {
        self.identifier = identifier
        self.fileName = fileName
        self.fileType = fileType
        self.syntax = syntax
        self.content = content
        self.highlights = highlights
    }
    
    public init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        type = try values.decode(RenderReferenceType.self, forKey: .type)
        identifier = try values.decode(RenderReferenceIdentifier.self, forKey: .identifier)
        fileName = try values.decode(String.self, forKey: .fileName)
        fileType = try values.decode(String.self, forKey: .fileType)
        syntax = try values.decode(String.self, forKey: .syntax)
        content = try values.decode([String].self, forKey: .content)
        highlights = try values.decodeIfPresent([LineHighlighter.Highlight].self, forKey: .highlights) ?? []
    }
}

// Diffable conformance
extension FileReference: RenderJSONDiffable {
    /// Returns the difference between this FileReference and the given one.
    func difference(from other: FileReference, at path: CodablePath) -> JSONPatchDifferences {
        var diffBuilder = DifferenceBuilder(current: self, other: other, basePath: path)

        diffBuilder.addDifferences(atKeyPath: \.type, forKey: CodingKeys.type)
        diffBuilder.addDifferences(atKeyPath: \.identifier, forKey: CodingKeys.identifier)
        diffBuilder.addDifferences(atKeyPath: \.fileType, forKey: CodingKeys.fileType)
        diffBuilder.addDifferences(atKeyPath: \.fileName, forKey: CodingKeys.fileName)
        diffBuilder.addDifferences(atKeyPath: \.syntax, forKey: CodingKeys.syntax)
        diffBuilder.addDifferences(atKeyPath: \.content, forKey: CodingKeys.content)
        diffBuilder.addDifferences(atKeyPath: \.highlights, forKey: CodingKeys.highlights)
        
        return diffBuilder.differences
    }
}

/// A reference to a type of file.
///
/// This is not a reference to a specific file, but rather to a type of file. Use a file type reference together with a file reference to display an icon for that file type
/// alongside the content of that file. For example, a property list file icon alongside the content of a specific property list file.
public struct FileTypeReference: RenderReference, Equatable {
    public var type: RenderReferenceType = .fileType
    
    /// The identifier of this reference.
    public var identifier: RenderReferenceIdentifier
    
    /// The display name of the file type.
    public var displayName: String
    
    /// The icon for this file type, encoded in Base64.
    public var iconBase64: Data
    
    /// Creates a new file type reference.
    /// - Parameters:
    ///   - identifier: The identifier of this reference.
    ///   - displayName: The display name of the file type.
    ///   - iconBase64: The icon for this file type, encoded in Base64.
    public init(identifier: RenderReferenceIdentifier, displayName: String, iconBase64: Data) {
        self.identifier = identifier
        self.displayName = displayName
        self.iconBase64 = iconBase64
    }
}

// Diffable conformance
extension FileTypeReference: RenderJSONDiffable {
    /// Returns the difference between this FileTypeReference and the given one.
    func difference(from other: FileTypeReference, at path: CodablePath) -> JSONPatchDifferences {
        var diffBuilder = DifferenceBuilder(current: self, other: other, basePath: path)

        diffBuilder.addDifferences(atKeyPath: \.displayName, forKey: CodingKeys.displayName)
        diffBuilder.addDifferences(atKeyPath: \.iconBase64, forKey: CodingKeys.iconBase64)

        return diffBuilder.differences
    }
}