import Foundation struct ImageToGenerate { let size: Int let image: FileResource } extension ImageToGenerate: Hashable { func hash(into hasher: inout Hasher) { hasher.combine(size) hasher.combine(image.id) } } final class PageGenerationResults: ObservableObject { @Published var linkedPages: Set = [] @Published var linkedTags: Set = [] @Published var externalLinks: Set = [] @Published var files: Set = [] @Published var imagesToGenerate: Set = [] @Published var missingPages: Set = [] @Published var missingFiles: Set = [] @Published var missingTags: Set = [] @Published var invalidCommands: [(command: ShorthandMarkdownKey?, markdown: String)] = [] @Published var requiredHeaders: RequiredHeaders = [] @Published var requiredFooters: Set = [] @Published var requiredIcons: Set = [] @Published var issues: Set = [] func reset() { linkedPages = [] linkedTags = [] externalLinks = [] files = [] imagesToGenerate = [] missingPages = [] missingFiles = [] missingTags = [] invalidCommands = [] requiredHeaders = [] requiredFooters = [] requiredIcons = [] issues = [] } func invalid(command: ShorthandMarkdownKey?, _ markdown: Substring) { invalidCommands.append((command, String(markdown))) issues.insert(.invalidCommand(command: command, markdown: String(markdown))) } func missing(page: String, markdown: Substring) { missingPages.insert(page) issues.insert(.missingPage(page: page, markdown: String(markdown))) } func missing(tag: String, markdown: Substring) { missingTags.insert(tag) issues.insert(.missingTag(tag: tag, markdown: String(markdown))) } func missing(file: String, markdown: Substring) { missingFiles.insert(file) issues.insert(.missingFile(file: file, markdown: String(markdown))) } }