import Infrastructure /// A static file shipped with the website service. /// /// Each case identifies a file name stored under the static files root (the `Resources/Static` directory) and served by Hummingbird's /// `FileMiddleware` middleware. A name can be available with more than one extension (see ``fileExtensions``), each resolving to its own file. enum StaticFile: Asset, CaseIterable { /// The `apple-touch-icon.png` icon. case appleTouchIcon /// The `css/error.css` stylesheet and `js/error.js` script for the not-found page. case error /// The `favicon.ico` icon. case favicon /// The `icon.svg` icon. case icon /// The `icon-192.png` icon for the web manifest. case icon192 /// The `icon-512.png` icon for the web manifest. case icon512 /// The `css/index.css` stylesheet and `js/index.js` script for the landing page. case index /// The `robots.txt` crawler directives. case robots /// The `css/shared.css` stylesheet and `js/shared.js` script shared across pages. case shared /// The `site.webmanifest` web application manifest. case site /// The `sitemap.xml` crawler sitemap. case sitemap } // MARK: - Extensions extension StaticFile { // MARK: Computed /// The file extensions the file is available with. var fileExtensions: [AssetExtension] { switch self { case .appleTouchIcon, .icon192, .icon512: [.png] case .error, .index, .shared: [.css, .js] case .favicon: [.ico] case .icon: [.svg] case .robots: [.txt] case .site: [.webmanifest] case .sitemap: [.xml] } } /// The file's name, without extension. var fileName: String { switch self { case .appleTouchIcon: "apple-touch-icon" case .error: "error" case .favicon: "favicon" case .icon: "icon" case .icon192: "icon-192" case .icon512: "icon-512" case .index: "index" case .robots: "robots" case .shared: "shared" case .site: "site" case .sitemap: "sitemap" } } }