Skip to content

Instantly share code, notes, and snippets.

@yusuke024
Created September 29, 2016 10:53
Show Gist options
  • Save yusuke024/055f84f158e44b20d559e47dc90c7550 to your computer and use it in GitHub Desktop.
Save yusuke024/055f84f158e44b20d559e47dc90c7550 to your computer and use it in GitHub Desktop.
// 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