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
}
}
|