/// A format listings are published in, declared in navigation order; the raw value is the search filter token. enum Format: String, CaseIterable, Sendable { /// Single-issue comics. case singleIssues = "single-issues" /// Manga volumes. case manga /// Trade paperbacks. case tradePaperbacks = "trade-paperbacks" /// Hardcovers. case hardcovers } // MARK: - Extensions extension Format { // MARK: Computed /// The format's name as shown in the navigation. var label: String { switch self { case .singleIssues: "Single issues" case .manga: "Manga" case .tradePaperbacks: "Trade paperbacks" case .hardcovers: "Hardcovers" } } /// The format's name for one item. var singular: String { switch self { case .singleIssues: "Single issue" case .manga: "Manga" case .tradePaperbacks: "Trade paperback" case .hardcovers: "Hardcover" } } /// What the format covers, in a sentence. var summary: String { switch self { case .singleIssues: "Raw and slabbed, all eras. Filter by grade, print and key status." case .manga: "Tankōbon volumes, box sets and first English printings." case .tradePaperbacks: "Collected runs and one-shots, with printing noted on every copy." case .hardcovers: "Omnibuses, deluxe editions and sealed copies." } } /// The path of the search screen filtered to the format. var path: String { "\(String.Route.search)?format=\(rawValue)" } }