Skip to content

Commit

Permalink
Total fucking rework. Can't fucking use the fucking generics and fuck…
Browse files Browse the repository at this point in the history
…ing associated types as fucking flexibly as we fucking want to.
  • Loading branch information
adam-rocska committed Sep 16, 2021
1 parent b9726ac commit 2182023
Show file tree
Hide file tree
Showing 33 changed files with 1,968 additions and 2,736 deletions.
9 changes: 1 addition & 8 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,7 @@ let package = Package(
),
],
targets: [
.target(name: "MediaTypeEnums"),
.target(name: "MediaTypeUtilities", dependencies: [
.byName(name: "MediaTypeEnums")
]),
.target(name: "MediaType", dependencies: [
.byName(name: "MediaTypeEnums"),
.byName(name: "MediaTypeUtilities")
]),
.target(name: "MediaType"),
.testTarget(name: "MediaTypeTests", dependencies: [.byName(name: "MediaType")])
]
)
18 changes: 18 additions & 0 deletions Sources/MediaType/Anything.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import Foundation

public enum Anything {
case other(CustomStringConvertible, Suffix? = nil, Parameters? = nil)
case anything(Suffix? = nil, Parameters? = nil)
}

extension Anything: CustomStringConvertible {
public var description: String {
switch self {
case .other(let subtype, let suffix, let params): return "\(subtype)\(suffix)\(params)"
case .anything(let suffix, let params): return "*\(suffix)\(params)"
}
}
}

extension Anything: MediaSubtype { public var type: MediaType { .anything(self) } }

863 changes: 863 additions & 0 deletions Sources/MediaType/Application.swift

Large diffs are not rendered by default.

249 changes: 249 additions & 0 deletions Sources/MediaType/Audio.swift

Large diffs are not rendered by default.

29 changes: 29 additions & 0 deletions Sources/MediaType/Font.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import Foundation

public enum Font {
case collection(Suffix? = nil, Parameters? = nil)
case otf(Suffix? = nil, Parameters? = nil)
case sfnt(Suffix? = nil, Parameters? = nil)
case ttf(Suffix? = nil, Parameters? = nil)
case woff(Suffix? = nil, Parameters? = nil)
case woff2(Suffix? = nil, Parameters? = nil)
case other(String, Suffix? = nil, Parameters? = nil)
case anything(Suffix? = nil, Parameters? = nil)
}

extension Font: CustomStringConvertible {
public var description: String {
switch self {
case .collection(let suffix, let parameters): return "collection\(suffix)\(parameters)"
case .otf(let suffix, let parameters): return "otf\(suffix)\(parameters)"
case .sfnt(let suffix, let parameters): return "sfnt\(suffix)\(parameters)"
case .ttf(let suffix, let parameters): return "ttf\(suffix)\(parameters)"
case .woff(let suffix, let parameters): return "woff\(suffix)\(parameters)"
case .woff2(let suffix, let parameters): return "woff2\(suffix)\(parameters)"
case .other(let value, let suffix, let parameters): return "\(value)\(suffix)\(parameters)"
case .anything(let suffix, let parameters): return "*\(suffix)\(parameters)"
}
}
}

extension Font: MediaSubtype { public var type: MediaType { .font(self) } }
97 changes: 97 additions & 0 deletions Sources/MediaType/Image.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
import Foundation

public enum Image {
case aces(Suffix? = nil, Parameters? = nil)
case avci(Suffix? = nil, Parameters? = nil)
case avcs(Suffix? = nil, Parameters? = nil)
case avif(Suffix? = nil, Parameters? = nil)
case bmp(Suffix? = nil, Parameters? = nil)
case cgm(Suffix? = nil, Parameters? = nil)
case dicomRle(Suffix? = nil, Parameters? = nil)
case emf(Suffix? = nil, Parameters? = nil)
case example(Suffix? = nil, Parameters? = nil)
case fits(Suffix? = nil, Parameters? = nil)
case g3fax(Suffix? = nil, Parameters? = nil)
case heic(Suffix? = nil, Parameters? = nil)
case heicSequence(Suffix? = nil, Parameters? = nil)
case heif(Suffix? = nil, Parameters? = nil)
case heifSequence(Suffix? = nil, Parameters? = nil)
case hej2k(Suffix? = nil, Parameters? = nil)
case hsj2(Suffix? = nil, Parameters? = nil)
case jls(Suffix? = nil, Parameters? = nil)
case jp2(Suffix? = nil, Parameters? = nil)
case jph(Suffix? = nil, Parameters? = nil)
case jphc(Suffix? = nil, Parameters? = nil)
case jpm(Suffix? = nil, Parameters? = nil)
case jpx(Suffix? = nil, Parameters? = nil)
case jxr(Suffix? = nil, Parameters? = nil)
case jxrA(Suffix? = nil, Parameters? = nil)
case jxrS(Suffix? = nil, Parameters? = nil)
case jxs(Suffix? = nil, Parameters? = nil)
case jxsc(Suffix? = nil, Parameters? = nil)
case jxsi(Suffix? = nil, Parameters? = nil)
case jxss(Suffix? = nil, Parameters? = nil)
case ktx(Suffix? = nil, Parameters? = nil)
case ktx2(Suffix? = nil, Parameters? = nil)
case naplps(Suffix? = nil, Parameters? = nil)
case png(Suffix? = nil, Parameters? = nil)
case pwgRaster(Suffix? = nil, Parameters? = nil)
case svg(Suffix? = nil, Parameters? = nil)
case t38(Suffix? = nil, Parameters? = nil)
case tiff(Suffix? = nil, Parameters? = nil)
case tiffFx(Suffix? = nil, Parameters? = nil)
case wmf(Suffix? = nil, Parameters? = nil)
case other(String, Suffix? = nil, Parameters? = nil)
case anything(Suffix? = nil, Parameters? = nil)
}

extension Image: CustomStringConvertible {
public var description: String {
switch self {
case .aces(let suffix, let parameters): return "aces\(suffix)\(parameters)"
case .avci(let suffix, let parameters): return "avci\(suffix)\(parameters)"
case .avcs(let suffix, let parameters): return "avcs\(suffix)\(parameters)"
case .avif(let suffix, let parameters): return "avif\(suffix)\(parameters)"
case .bmp(let suffix, let parameters): return "bmp\(suffix)\(parameters)"
case .cgm(let suffix, let parameters): return "cgm\(suffix)\(parameters)"
case .dicomRle(let suffix, let parameters): return "dicom-rle\(suffix)\(parameters)"
case .emf(let suffix, let parameters): return "emf\(suffix)\(parameters)"
case .example(let suffix, let parameters): return "example\(suffix)\(parameters)"
case .fits(let suffix, let parameters): return "fits\(suffix)\(parameters)"
case .g3fax(let suffix, let parameters): return "g3fax\(suffix)\(parameters)"
case .heic(let suffix, let parameters): return "heic\(suffix)\(parameters)"
case .heicSequence(let suffix, let parameters): return "heic-sequence\(suffix)\(parameters)"
case .heif(let suffix, let parameters): return "heif\(suffix)\(parameters)"
case .heifSequence(let suffix, let parameters): return "heif-sequence\(suffix)\(parameters)"
case .hej2k(let suffix, let parameters): return "hej2k\(suffix)\(parameters)"
case .hsj2(let suffix, let parameters): return "hsj2\(suffix)\(parameters)"
case .jls(let suffix, let parameters): return "jls\(suffix)\(parameters)"
case .jp2(let suffix, let parameters): return "jp2\(suffix)\(parameters)"
case .jph(let suffix, let parameters): return "jph\(suffix)\(parameters)"
case .jphc(let suffix, let parameters): return "jphc\(suffix)\(parameters)"
case .jpm(let suffix, let parameters): return "jpm\(suffix)\(parameters)"
case .jpx(let suffix, let parameters): return "jpx\(suffix)\(parameters)"
case .jxr(let suffix, let parameters): return "jxr\(suffix)\(parameters)"
case .jxrA(let suffix, let parameters): return "jxrA\(suffix)\(parameters)"
case .jxrS(let suffix, let parameters): return "jxrS\(suffix)\(parameters)"
case .jxs(let suffix, let parameters): return "jxs\(suffix)\(parameters)"
case .jxsc(let suffix, let parameters): return "jxsc\(suffix)\(parameters)"
case .jxsi(let suffix, let parameters): return "jxsi\(suffix)\(parameters)"
case .jxss(let suffix, let parameters): return "jxss\(suffix)\(parameters)"
case .ktx(let suffix, let parameters): return "ktx\(suffix)\(parameters)"
case .ktx2(let suffix, let parameters): return "ktx2\(suffix)\(parameters)"
case .naplps(let suffix, let parameters): return "naplps\(suffix)\(parameters)"
case .png(let suffix, let parameters): return "png\(suffix)\(parameters)"
case .pwgRaster(let suffix, let parameters): return "pwg-raster\(suffix)\(parameters)"
case .svg(let suffix, let parameters): return "svg\(suffix)\(parameters)"
case .t38(let suffix, let parameters): return "t38\(suffix)\(parameters)"
case .tiff(let suffix, let parameters): return "tiff\(suffix)\(parameters)"
case .tiffFx(let suffix, let parameters): return "tiff-fx\(suffix)\(parameters)"
case .wmf(let suffix, let parameters): return "wmf\(suffix)\(parameters)"
case .other(let value, let suffix, let parameters): return "\(value)\(suffix)\(parameters)"
case .anything(let suffix, let parameters): return "*\(suffix)\(parameters)"
}
}
}

extension Image: MediaSubtype { public var type: MediaType { .image(self) } }
5 changes: 5 additions & 0 deletions Sources/MediaType/MediaSubtype.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import Foundation

public protocol MediaSubtype {
var type: MediaType { get }
}
36 changes: 34 additions & 2 deletions Sources/MediaType/MediaType.swift
Original file line number Diff line number Diff line change
@@ -1,2 +1,34 @@
@_exported import MediaTypeEnums
@_exported import MediaTypeUtilities
import Foundation

public enum MediaType {
case application(Application)
case audio(Audio)
case font(Font)
case image(Image)
case message(Message)
case model(Model)
case multipart(Multipart)
case text(Text)
case video(Video)
case other(type: String, subtype: String, Suffix? = nil, Parameters? = nil)
case anything(Anything)
}

extension MediaType: CustomStringConvertible {
public var description: String {
switch self {
case .application(let subtype): return "application/\(subtype)"
case .audio(let subtype): return "audio/\(subtype)"
case .font(let subtype): return "font/\(subtype)"
case .image(let subtype): return "image/\(subtype)"
case .message(let subtype): return "message/\(subtype)"
case .model(let subtype): return "model/\(subtype)"
case .multipart(let subtype): return "multipart/\(subtype)"
case .text(let subtype): return "text/\(subtype)"
case .video(let subtype): return "video/\(subtype)"
case .other(let type, let subtype, let suffix, let parameters):return "\(type)/\(subtype)\(suffix)\(parameters)"
case .anything(let anything): return "*/\(anything)"
}
}
}

49 changes: 49 additions & 0 deletions Sources/MediaType/Message.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import Foundation

public enum Message {
case CPIM(Suffix? = nil, Parameters? = nil)
case deliveryStatus(Suffix? = nil, Parameters? = nil)
case dispositionNotification(Suffix? = nil, Parameters? = nil)
case example(Suffix? = nil, Parameters? = nil)
case feedbackReport(Suffix? = nil, Parameters? = nil)
case global(Suffix? = nil, Parameters? = nil)
case globalDeliveryStatus(Suffix? = nil, Parameters? = nil)
case globalDispositionNotification(Suffix? = nil, Parameters? = nil)
case globalHeaders(Suffix? = nil, Parameters? = nil)
case http(Suffix? = nil, Parameters? = nil)
case imdn(Suffix? = nil, Parameters? = nil)
case news(Suffix? = nil, Parameters? = nil)
case sHttp(Suffix? = nil, Parameters? = nil)
case sip(Suffix? = nil, Parameters? = nil)
case sipfrag(Suffix? = nil, Parameters? = nil)
case trackingStatus(Suffix? = nil, Parameters? = nil)
case other(String, Suffix? = nil, Parameters? = nil)
case anything(Suffix? = nil, Parameters? = nil)
}

extension Message: CustomStringConvertible {
public var description: String {
switch self {
case .CPIM(let suffix, let parameters): return "CPIM\(suffix)\(parameters)"
case .deliveryStatus(let suffix, let parameters): return "delivery-status\(suffix)\(parameters)"
case .dispositionNotification(let suffix, let parameters): return "disposition-notification\(suffix)\(parameters)"
case .example(let suffix, let parameters): return "example\(suffix)\(parameters)"
case .feedbackReport(let suffix, let parameters): return "feedback-report\(suffix)\(parameters)"
case .global(let suffix, let parameters): return "global\(suffix)\(parameters)"
case .globalDeliveryStatus(let suffix, let parameters): return "global-delivery-status\(suffix)\(parameters)"
case .globalDispositionNotification(let suffix, let parameters): return "global-disposition-notification\(suffix)\(parameters)"
case .globalHeaders(let suffix, let parameters): return "global-headers\(suffix)\(parameters)"
case .http(let suffix, let parameters): return "http\(suffix)\(parameters)"
case .imdn(let suffix, let parameters): return "imdn\(suffix)\(parameters)"
case .news(let suffix, let parameters): return "news\(suffix)\(parameters)"
case .sHttp(let suffix, let parameters): return "s-http\(suffix)\(parameters)"
case .sip(let suffix, let parameters): return "sip\(suffix)\(parameters)"
case .sipfrag(let suffix, let parameters): return "sipfrag\(suffix)\(parameters)"
case .trackingStatus(let suffix, let parameters): return "tracking-status\(suffix)\(parameters)"
case .other(let value, let suffix, let parameters): return "\(value)\(suffix)\(parameters)"
case .anything(let suffix, let parameters): return "*\(suffix)\(parameters)"
}
}
}

extension Message: MediaSubtype { public var type: MediaType { .message(self) } }
43 changes: 43 additions & 0 deletions Sources/MediaType/Model.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import Foundation

public enum Model {
case _3mf(Suffix? = nil, Parameters? = nil)
case e57(Suffix? = nil, Parameters? = nil)
case example(Suffix? = nil, Parameters? = nil)
case gltfBinary(Suffix? = nil, Parameters? = nil)
case gltf(Suffix? = nil, Parameters? = nil)
case iges(Suffix? = nil, Parameters? = nil)
case mtl(Suffix? = nil, Parameters? = nil)
case obj(Suffix? = nil, Parameters? = nil)
case step(Suffix? = nil, Parameters? = nil)
case stepXml(Suffix? = nil, Parameters? = nil)
case stl(Suffix? = nil, Parameters? = nil)
case x3dVrml(Suffix? = nil, Parameters? = nil)
case x3d(Suffix? = nil, Parameters? = nil)
case other(String, Suffix? = nil, Parameters? = nil)
case anything(Suffix? = nil, Parameters? = nil)
}

extension Model: CustomStringConvertible {
public var description: String {
switch self {
case ._3mf(let suffix, let parameters): return "3mf\(suffix)\(parameters)"
case .e57(let suffix, let parameters): return "e57\(suffix)\(parameters)"
case .example(let suffix, let parameters): return "example\(suffix)\(parameters)"
case .gltfBinary(let suffix, let parameters): return "gltf-binary\(suffix)\(parameters)"
case .gltf(let suffix, let parameters): return "gltf\(suffix)\(parameters)"
case .iges(let suffix, let parameters): return "iges\(suffix)\(parameters)"
case .mtl(let suffix, let parameters): return "mtl\(suffix)\(parameters)"
case .obj(let suffix, let parameters): return "obj\(suffix)\(parameters)"
case .step(let suffix, let parameters): return "step\(suffix)\(parameters)"
case .stepXml(let suffix, let parameters): return "step-xml\(suffix)\(parameters)"
case .stl(let suffix, let parameters): return "stl\(suffix)\(parameters)"
case .x3dVrml(let suffix, let parameters): return "x3d-vrml\(suffix)\(parameters)"
case .x3d(let suffix, let parameters): return "x3d\(suffix)\(parameters)"
case .other(let value, let suffix, let parameters): return "\(value)\(suffix)\(parameters)"
case .anything(let suffix, let parameters): return "*\(suffix)\(parameters)"
}
}
}

extension Model: MediaSubtype { public var type: MediaType { .model(self) } }
41 changes: 41 additions & 0 deletions Sources/MediaType/Multipart.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import Foundation

public enum Multipart {
case appledouble(Suffix? = nil, Parameters? = nil)
case byteranges(Suffix? = nil, Parameters? = nil)
case encrypted(Suffix? = nil, Parameters? = nil)
case example(Suffix? = nil, Parameters? = nil)
case formData(Suffix? = nil, Parameters? = nil)
case headerSet(Suffix? = nil, Parameters? = nil)
case multilingual(Suffix? = nil, Parameters? = nil)
case related(Suffix? = nil, Parameters? = nil)
case report(Suffix? = nil, Parameters? = nil)
case signed(Suffix? = nil, Parameters? = nil)
case voiceMessage(Suffix? = nil, Parameters? = nil)
case xMixedReplace(Suffix? = nil, Parameters? = nil)
case other(String, Suffix? = nil, Parameters? = nil)
case anything(Suffix? = nil, Parameters? = nil)
}

extension Multipart: CustomStringConvertible {
public var description: String {
switch self {
case .appledouble(let suffix, let parameters): return "appledouble\(suffix)\(parameters)"
case .byteranges(let suffix, let parameters): return "byteranges\(suffix)\(parameters)"
case .encrypted(let suffix, let parameters): return "encrypted\(suffix)\(parameters)"
case .example(let suffix, let parameters): return "example\(suffix)\(parameters)"
case .formData(let suffix, let parameters): return "form-data\(suffix)\(parameters)"
case .headerSet(let suffix, let parameters): return "header-set\(suffix)\(parameters)"
case .multilingual(let suffix, let parameters): return "multilingual\(suffix)\(parameters)"
case .related(let suffix, let parameters): return "related\(suffix)\(parameters)"
case .report(let suffix, let parameters): return "report\(suffix)\(parameters)"
case .signed(let suffix, let parameters): return "signed\(suffix)\(parameters)"
case .voiceMessage(let suffix, let parameters): return "voice-message\(suffix)\(parameters)"
case .xMixedReplace(let suffix, let parameters): return "x-mixed-replace\(suffix)\(parameters)"
case .other(let value, let suffix, let parameters): return "\(value)\(suffix)\(parameters)"
case .anything(let suffix, let parameters): return "*\(suffix)\(parameters)"
}
}
}

extension Multipart: MediaSubtype { public var type: MediaType { .multipart(self) } }
17 changes: 17 additions & 0 deletions Sources/MediaType/Parameters.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import Foundation

public typealias Parameters = [String: CustomStringConvertible?]

internal extension DefaultStringInterpolation {
@inlinable mutating func appendInterpolation(_ value: Parameters?) {
guard let parameters = value else { return }
if parameters.isEmpty { return }
for (key, value) in parameters {
appendLiteral(";")
appendLiteral(key)
guard let value = value else { continue }
appendLiteral("=")
appendLiteral(value.description)
}
}
}
31 changes: 31 additions & 0 deletions Sources/MediaType/Suffix.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import Foundation

public enum Suffix: String {
case xml = "+xml"
case json = "+json"
case ber = "+ber"
case cbor = "+cbor"
case der = "+der"
case fastinfoset = "+fastinfoset"
case wbxml = "+wbxml"
case zip = "+zip"
case tlv = "+tlv"
case jsonSeq = "+json-seq"
case sqlite3 = "+sqlite3"
case jwt = "+jwt"
case gzip = "+gzip"
case cborSeq = "+cbor-seq"
case zstd = "+zstd"
}

extension Suffix: CustomStringConvertible { public var description: String { rawValue } }

extension Optional: CustomStringConvertible where Wrapped == Suffix {
public var description: String {
switch self {
case .none: return ""
case .some(let value): return value.description
}
}
}

Loading

0 comments on commit 2182023

Please sign in to comment.