# Diana.jl

A Julia GraphQL client/server implementation.

DOI

#### Contributions welcomed! This repository is an implementation of a GraphQL server, a query language for API created by Facebook. See more complete documentation at http://graphql.org/ Looking for help? Find resources from the community. ### Getting Started An overview of GraphQL in general is available in the [README](https://github.com/facebook/graphql/blob/master/README.md) for the Specification for GraphQL. This package is intended to help you building GraphQL schemas/types fast and easily. + **Easy to use:** Diana.jl helps you use GraphQL in Julia without effort. + **Data agnostic:** Diana.jl supports any type of data source: SQL, NoSQL, etc. The intent is to provide a complete API and make your data available through GraphQL. + **Make queries:** Diana.jl allows queries to graphql schemas. ## Installation ```julia Pkg> add Diana #Release pkg> add Diana#master #Development ``` ## Examples Client ------- ```julia query = """ { neomatrix{ nombre linkedin } } """ r = Queryclient("https://neomatrix.herokuapp.com/graphql",query) ``` ```julia client = GraphQLClient("https://api.graph.cool/simple/v1/movies",auth="Bearer my-jwt-token") query2 = """ query getMovie(\$title: String!) { Movie(title:\$title) { releaseDate actors { name } } } """ r = client.Query(query2,vars=Dict("title" => "Inception")) r.Data # "{\"data\":{\"Movie\":{\"releaseDate\":\"2010-08-28T20:00:00.000Z\",\"actors\":[{\"name\":\"Leonardo DiCaprio\"},{\"name\":\"Ellen Page\"},{\"name\":\"Tom Hardy\"},{\"name\":\"Joseph Gordon-Levitt\"},{\"name\":\"Marion Cotillard\"}]}}}" ``` Server ------- Here is one example for you to get started: ```julia schema = Dict( "query" => "Query" ,"Query"=> Dict( "persona"=>Dict("tipo"=>"Persona") ,"neomatrix"=>Dict("tipo"=>"Persona") ) ,"Persona" => Dict( "edad"=>Dict("tipo"=>"Int") ,"nombre"=>Dict("tipo"=>"String") ) ) resolvers=Dict( "Query"=>Dict( "neomatrix" => (root,args,ctx,info)->(return Dict("nombre"=>"josue","edad"=>26)) ,"persona" => (root,args,ctx,info)->(return Dict("nombre"=>"Diana","edad"=>25)) ) ,"Persona"=>Dict( "edad" => (root,args,ctx,info)->(return root["edad"]) ) ) my_schema = Schema(schema, resolvers) ``` Then Querying `Diana.Schema` is as simple as: ```julia query= """ { neomatrix{ nombre } } """ result = my_schema.execute(query) # "{\"data\":{\"neomatrix\":{\"nombre\":\"josue\"}}}" ``` ## TODO - [x] Client - [x] Lexer - [x] Parser - [x] Query validation - [x] Schemas / Types - [x] Query execution - [x] Arguments - [x] Scalar types - [x] Multiple forms of resolution - [x] Extract variable values - [ ] Complex types (List, Object, etc) - [ ] Fragments in queries - [ ] Directives - [x] Mutation execution - [ ] Subscriptions execution - [ ] Introspection - [ ] Depth of the query - [ ] Middleware ## Documentation Documentation and links to additional resources are available at https://neomatrixcode.gitbook.io/diana/