Skip to content

Instantly share code, notes, and snippets.

@yusuke024
Last active September 29, 2016 08:18
Show Gist options
  • Save yusuke024/e8ffbe29e9ad31e1cd6dcb0b52059b6e to your computer and use it in GitHub Desktop.
Save yusuke024/e8ffbe29e9ad31e1cd6dcb0b52059b6e to your computer and use it in GitHub Desktop.
protocol Query {
func serialized() -> String
}
protocol Field: Query {
}
protocol Argument {
// ...
}
protocol Object: Query {
associatedtype FieldType: Field
var fields: [FieldType] { get }
var arguments: [Argument]? { get }
}
// ---
enum TaskField: Field {
case id, title
func serialized() -> String {
switch self {
case .id:
return "id"
case .title:
return "title"
}
}
}
struct TaskQuery: Object {
var fields: [TaskField]
var arguments: [Argument]?
func serialized() -> String {
return "tasks {\(fields.map({ $0.serialized() }).joined(separator: " "))}"
}
}
enum UserField: Field {
case id, firstName, lastName, tasks(TaskQuery)
func serialized() -> String {
switch self {
case .id:
return "id"
case .firstName:
return "firstName"
case .lastName:
return "lastName"
case .tasks(let taskQuery):
return taskQuery.serialized()
}
}
}
struct UserQuery: Object {
var fields: [UserField]
var arguments: [Argument]?
func serialized() -> String {
return "user {\(fields.map({ $0.serialized() }).joined(separator: " "))}"
}
}
let taskQuery = TaskQuery(fields: [.id, .title], arguments: nil)
let userQuery = UserQuery(fields: [.id, .tasks(taskQuery)], arguments: nil)
userQuery.serialized()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment