Skip to content

Commit

Permalink
separate example/starwars package
Browse files Browse the repository at this point in the history
  • Loading branch information
neelance committed Oct 17, 2016
1 parent e4060db commit 6f9a89d
Show file tree
Hide file tree
Showing 2 changed files with 378 additions and 375 deletions.
354 changes: 354 additions & 0 deletions example/starwars/starwars.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,354 @@
package starwars

var Schema = `
schema {
query: Query
mutation: Mutation
}
# The query type, represents all of the entry points into our object graph
type Query {
hero(episode: Episode): Character
reviews(episode: Episode!): [Review]
search(text: String): [SearchResult]
character(id: ID!): Character
droid(id: ID!): Droid
human(id: ID!): Human
starship(id: ID!): Starship
}
# The mutation type, represents all updates we can make to our data
type Mutation {
createReview(episode: Episode, review: ReviewInput!): Review
}
# The episodes in the Star Wars trilogy
enum Episode {
# Star Wars Episode IV: A New Hope, released in 1977.
NEWHOPE
# Star Wars Episode V: The Empire Strikes Back, released in 1980.
EMPIRE
# Star Wars Episode VI: Return of the Jedi, released in 1983.
JEDI
}
# A character from the Star Wars universe
interface Character {
# The ID of the character
id: ID!
# The name of the character
name: String!
# The friends of the character, or an empty list if they have none
friends: [Character]
# The friends of the character exposed as a connection with edges
friendsConnection(first: Int, after: ID): FriendsConnection!
# The movies this character appears in
appearsIn: [Episode]!
}
# Units of height
enum LengthUnit {
# The standard unit around the world
METER
# Primarily used in the United States
FOOT
}
# A humanoid creature from the Star Wars universe
type Human implements Character {
# The ID of the human
id: ID!
# What this human calls themselves
name: String!
# Height in the preferred unit, default is meters
height(unit: LengthUnit = METER): Float
# Mass in kilograms, or null if unknown
mass: Float
# This human's friends, or an empty list if they have none
friends: [Character]
# The friends of the human exposed as a connection with edges
friendsConnection(first: Int, after: ID): FriendsConnection!
# The movies this human appears in
appearsIn: [Episode]!
# A list of starships this person has piloted, or an empty list if none
starships: [Starship]
}
# An autonomous mechanical character in the Star Wars universe
type Droid implements Character {
# The ID of the droid
id: ID!
# What others call this droid
name: String!
# This droid's friends, or an empty list if they have none
friends: [Character]
# The friends of the droid exposed as a connection with edges
friendsConnection(first: Int, after: ID): FriendsConnection!
# The movies this droid appears in
appearsIn: [Episode]!
# This droid's primary function
primaryFunction: String
}
# A connection object for a character's friends
type FriendsConnection {
# The total number of friends
totalCount: Int
# The edges for each of the character's friends.
edges: [FriendsEdge]
# A list of the friends, as a convenience when edges are not needed.
friends: [Character]
# Information for paginating this connection
pageInfo: PageInfo!
}
# An edge object for a character's friends
type FriendsEdge {
# A cursor used for pagination
cursor: ID!
# The character represented by this friendship edge
node: Character
}
# Information for paginating this connection
type PageInfo {
startCursor: ID
endCursor: ID
hasNextPage: Boolean!
}
# Represents a review for a movie
type Review {
# The number of stars this review gave, 1-5
stars: Int!
# Comment about the movie
commentary: String
}
# The input object sent when someone is creating a new review
input ReviewInput {
# 0-5 stars
stars: Int!
# Comment about the movie, optional
commentary: String
}
type Starship {
# The ID of the starship
id: ID!
# The name of the starship
name: String!
# Length of the starship, along the longest axis
length(unit: LengthUnit = METER): Float
}
union SearchResult = Human | Droid | Starship
`

type human struct {
ID string
Name string
Friends []string
AppearsIn []string
Height float64
Mass int
Starships []string
}

var humans = []*human{
{
ID: "1000",
Name: "Luke Skywalker",
Friends: []string{"1002", "1003", "2000", "2001"},
AppearsIn: []string{"NEWHOPE", "EMPIRE", "JEDI"},
Height: 1.72,
Mass: 77,
Starships: []string{"3001", "3003"},
},
{
ID: "1001",
Name: "Darth Vader",
Friends: []string{"1004"},
AppearsIn: []string{"NEWHOPE", "EMPIRE", "JEDI"},
Height: 2.02,
Mass: 136,
Starships: []string{"3002"},
},
{
ID: "1002",
Name: "Han Solo",
Friends: []string{"1000", "1003", "2001"},
AppearsIn: []string{"NEWHOPE", "EMPIRE", "JEDI"},
Height: 1.8,
Mass: 80,
Starships: []string{"3000", "3003"},
},
{
ID: "1003",
Name: "Leia Organa",
Friends: []string{"1000", "1002", "2000", "2001"},
AppearsIn: []string{"NEWHOPE", "EMPIRE", "JEDI"},
Height: 1.5,
Mass: 49,
},
{
ID: "1004",
Name: "Wilhuff Tarkin",
Friends: []string{"1001"},
AppearsIn: []string{"NEWHOPE"},
Height: 1.8,
Mass: 0,
},
}

var humanData = make(map[string]*human)

func init() {
for _, h := range humans {
humanData[h.ID] = h
}
}

type droid struct {
ID string
Name string
Friends []string
AppearsIn []string
PrimaryFunction string
}

var droids = []*droid{
{
ID: "2000",
Name: "C-3PO",
Friends: []string{"1000", "1002", "1003", "2001"},
AppearsIn: []string{"NEWHOPE", "EMPIRE", "JEDI"},
PrimaryFunction: "Protocol",
},
{
ID: "2001",
Name: "R2-D2",
Friends: []string{"1000", "1002", "1003"},
AppearsIn: []string{"NEWHOPE", "EMPIRE", "JEDI"},
PrimaryFunction: "Astromech",
},
}

var droidData = make(map[string]*droid)

func init() {
for _, d := range droids {
droidData[d.ID] = d
}
}

type starship struct {
ID string
Name string
Length float64
}

var starships = []*starship{
{
ID: "3000",
Name: "Millenium Falcon",
Length: 34.37,
},
{
ID: "3001",
Name: "X-Wing",
Length: 12.5,
},
{
ID: "3002",
Name: "TIE Advanced x1",
Length: 9.2,
},
{
ID: "3003",
Name: "Imperial shuttle",
Length: 20,
},
}

var starshipData = make(map[string]*starship)

func init() {
for _, s := range starships {
starshipData[s.ID] = s
}
}

type Resolver struct{}

func (r *Resolver) Hero(args struct{ Episode string }) characterResolver {
if args.Episode == "EMPIRE" {
return &humanResolver{humanData["1000"]}
}
return &droidResolver{droidData["2001"]}
}

func (r *Resolver) Human(args struct{ ID string }) *humanResolver {
h := humanData[args.ID]
if h == nil {
return nil
}
return &humanResolver{h}
}

type characterResolver interface {
ID() string
Name() string
Friends() []characterResolver
AppearsIn() []string
}

type humanResolver struct {
h *human
}

func (r *humanResolver) ID() string {
return r.h.ID
}

func (r *humanResolver) Name() string {
return r.h.Name
}

func (r *humanResolver) Height(args struct{ Unit string }) float64 {
switch args.Unit {
case "METER":
return r.h.Height
case "FOOT":
return r.h.Height * 3.28084
default:
panic("invalid unit")
}
}

func (r *humanResolver) Friends() []characterResolver {
return resolveCharacters(r.h.Friends)
}

func (r *humanResolver) AppearsIn() []string {
return r.h.AppearsIn
}

type droidResolver struct {
d *droid
}

func (r *droidResolver) ID() string {
return r.d.ID
}

func (r *droidResolver) Name() string {
return r.d.Name
}

func (r *droidResolver) Friends() []characterResolver {
return resolveCharacters(r.d.Friends)
}

func (r *droidResolver) AppearsIn() []string {
return r.d.AppearsIn
}

func resolveCharacters(ids []string) []characterResolver {
var characters []characterResolver
for _, id := range ids {
if h, ok := humanData[id]; ok {
characters = append(characters, &humanResolver{h})
}
if d, ok := droidData[id]; ok {
characters = append(characters, &droidResolver{d})
}
}
return characters
}
Loading

0 comments on commit 6f9a89d

Please sign in to comment.