Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/owanturist/elm-graphql
Build GraphQL schemes and decoder together
https://github.com/owanturist/elm-graphql
decode elm graphql
Last synced: about 1 month ago
JSON representation
Build GraphQL schemes and decoder together
- Host: GitHub
- URL: https://github.com/owanturist/elm-graphql
- Owner: owanturist
- License: mit
- Created: 2018-06-29T08:55:51.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2019-07-05T11:19:04.000Z (over 5 years ago)
- Last Synced: 2024-10-12T23:46:48.641Z (2 months ago)
- Topics: decode, elm, graphql
- Language: Elm
- Size: 119 KB
- Stars: 1
- Watchers: 3
- Forks: 0
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# GraphQL in Elm
This package helps you build GraphQL together with Decoders
and then build a HTTP request with nice chainable interface
(adoptation of [lukewestby/elm-http-builder][elm-http-builder]).## Example
Let's imagine that you want to request some information about current user:
```elm
module Api exposing (User, me, renameMe)import GraphQL
import GraphQL.Argument as Argument
import GraphQL.Selector as Selector exposing (Selector)type Msg
= ReceiveUserDone (Result Selector.Error User)
| RenameUserDone (Result Selector.Error User)type alias User =
{ id : String
, name : String
, email : String
, age : Int
, rating : Float
}userSelector : Selector User
userSelector =
Selector.map5 User
(Selector.field "id" [] Selector.string)
(Selector.field "name" [] Selector.string)
(Selector.field "email" [] Selector.string)
(Selector.field "age" [] Selector.int)
(Selector.field "rating" [] Selector.float)me : String -> GraphQL.Request User
me token =
Selector.field "me" [] userSelector
|> GraphQL.query "GetMe"
|> GraphQL.post "https://my-awesome-graphql-server.com"
|> GraphQL.withBearerToken token-- if you send `me` query like this
meCmd : Cmd Msg
meCmd =
Selector.send ReceiveUserDone (me "token")-- it builds `Decoder` which equal to:
meDecoder : Json.Decode.Decoder User
meDecoder =
-- a user decoder
Json.Decode.map5 User
(Json.Decode.field "id" Json.Decode.string)
(Json.Decode.field "name" Json.Decode.string)
(Json.Decode.field "email" Json.Decode.string)
(Json.Decode.field "age" Json.Decode.int)
(Json.Decode.field "rating" Json.Decode.float)
-- field of query
|> Json.Decode.field "me"
-- configurable container of GraphQL server response
|> Json.Decode.field "data"-- and GraphQL:
meGraphQL : String
meGraphQL =
"""
query RenameMe {
me {
id
name
age
rating
}
}
"""renameMe : String -> String -> GraphQL.Request User
renameMe token nextName =
Selector.field "updateMe"
[ ( "name", Argument.string name )
]
userSelector
|> GraphQL.mutation "RenameMe"
|> GraphQL.post "https://my-awesome-graphql-server.com"
|> GraphQL.withBearerToken token-- and if you send `renameMe` mutation like this
renameMeCmd : Cmd Msg
renameMeCmd =
Selector.send RenameUserDone (renameMe "token" "Newname")-- it builds `Decoder` which equal to:
renameMeDecoder : Json.Decode.Decoder User
renameMeDecoder =
-- a user decoder
Json.Decode.map5 User
(Json.Decode.field "id" Json.Decode.string)
(Json.Decode.field "name" Json.Decode.string)
(Json.Decode.field "email" Json.Decode.string)
(Json.Decode.field "age" Json.Decode.int)
(Json.Decode.field "rating" Json.Decode.float)
-- field of query
|> Json.Decode.field "updateMe"
-- configurable container of GraphQL server response
|> Json.Decode.field "data"-- and GraphQL:
renameMeGraphQL : String
renameMeGraphQL =
"""
mutation RenameMe {
updateMe(name: "Newname") {
id
name
age
rating
}
}
"""
```So you need no more to configure `Decoder`s and build GraphQL separately each other!
You can do all stuff exactly like with `Decoder`: combine, nest and reuse described `Selector`s.[elm-http-builder]: https://github.com/lukewestby/elm-http-builder