Created
September 29, 2016 10:53
-
-
Save yusuke024/055f84f158e44b20d559e47dc90c7550 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Protocols | |
protocol Serializable { | |
func serialized() -> String | |
} | |
protocol Field: Serializable { | |
// ... | |
} | |
protocol Argument: Serializable { | |
// ... | |
} | |
protocol Object: Serializable { | |
associatedtype FieldType: Field | |
var fields: [FieldType] { get } | |
var arguments: [Argument]? { get } | |
} | |
extension Object { | |
func serialized() -> String { | |
return "{ \(fields.map({ $0.serialized() }).joined(separator: " ")) }" | |
} | |
} | |
// Concrete Types | |
enum Schema: Serializable { | |
case query(Query) | |
case mutation(Mutation) | |
func serialized() -> String { | |
switch self { | |
case .query(let query): | |
return "query \(query.serialized())" | |
case .mutation(let mutation): | |
return "mutation \(mutation.serialized())" | |
} | |
} | |
} | |
enum Query: Serializable { | |
case viewer(User) | |
func serialized() -> String { | |
switch self { | |
case .viewer(let user): | |
return "{ viewer \(user.serialized())}" | |
} | |
} | |
} | |
struct Mutation: Serializable { | |
func serialized() -> String { | |
return "" | |
} | |
} | |
enum UserField: Field { | |
case id | |
case login | |
case name | |
func serialized() -> String { | |
switch self { | |
case .id: | |
return "id" | |
case .login: | |
return "login" | |
case .name: | |
return "name" | |
} | |
} | |
} | |
struct User: Object { | |
var fields: [UserField] | |
var arguments: [Argument]? | |
} | |
let user = User(fields: [.id, .login, .name], arguments: nil) | |
let schema = Schema.query(.viewer(user)) | |
schema.serialized() // output: "query { viewer { id login name }}" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment