GraphqlQuery.Document (graphql_query v0.3.7)

View Source

Struct representation of a GraphQL query or mutation.

If you need to build documents or fragments manually, you can use this methods.

Example

  # Fragments
iex> fragment = GraphqlQuery.Document.new("fragment UserFields on User { id name }", name: "UserFields", type: :fragment)
iex> fragment.__struct__ == GraphqlQuery.Fragment
true
iex> fragment.name
"UserFields"
iex> fragment.name
"UserFields"
iex> fragment.fragment
"fragment UserFields on User { id name }"

# Queries
iex> fragment = GraphqlQuery.Document.new("fragment UserFields on User { id name }", name: "UserFields", type: :fragment)
iex> query = GraphqlQuery.Document.new("query { user { ...UserFields } }", fragments: [fragment])
iex> query.query
"query { user { ...UserFields } }"

# Schemas
iex> schema = GraphqlQuery.Document.new("schema { query: Query }", type: :schema)
iex> schema.query
"schema { query: Query }"
iex> schema.type
:schema

# Manupilate the documents
iex> query = GraphqlQuery.Document.new("query U(userId: ID!) { user(id: $userId) { ...UserFragment } }")
iex> query = GraphqlQuery.Document.add_variable(query, :userId, 1)
iex> query.variables
%{userId: 1}
iex> query = GraphqlQuery.Document.add_variables(query, [userId: 2, anotherVar: "test"])
iex> query.variables
%{userId: 2, anotherVar: "test"}
iex> fragment = GraphqlQuery.Document.new("fragment UserFields on User { id name }", name: "UserFields", type: :fragment)
iex> query = GraphqlQuery.Document.add_fragment(query, fragment)
iex> query.fragments == [fragment]
true
iex> query = GraphqlQuery.Document.add_fragments(query, [fragment])
iex> query.fragments == [fragment]
true
iex> query = GraphqlQuery.Document.set_schema(query, MyApp.Schema)
iex> query.schema
MyApp.Schema

# Convert to string or encode as JSON
iex> fragment = GraphqlQuery.Document.new("fragment UserFragment on User { id name }", name: "UserFragment", type: :fragment)
iex> query = GraphqlQuery.Document.new("query User(userId: ID!) { user(id: $userId) { ...UserFragment } }", fragments: [fragment])
iex> query = GraphqlQuery.Document.add_variable(query, :userId, 1)
iex> to_string(query)   # String representation
"query User(userId: ID!) { user(id: $userId) { ...UserFragment } }\nfragment UserFragment on User { id name }"
iex> query |> Jason.encode!() |> Jason.decode!()   # JSON encoding (works with Jason and JSON libraries)
%{"query" => "query User(userId: ID!) { user(id: $userId) { ...UserFragment } }\nfragment UserFragment on User { id name }", "variables" => %{"userId" => 1}}

Summary

Functions

Add a fragment to the document, if it's not a Fragment struct, it will be ignored.

Add multiple fragments to the document, if they are not Fragment structs, they will be ignored.

Add a variable to the document

Add multiple variables to the document

Format a query with its fragments into a single string.

Create a new GraphQL document or fragment from a document string and options.

Set the name of the document

Set schema to the document

Types

document()

@type document() :: t() | GraphqlQuery.Fragment.t()

new_options()

@type new_options() :: [
  path: String.t() | nil,
  type: :query | :schema | :fragment,
  schema: module() | nil,
  fragments: [GraphqlQuery.Fragment.t()],
  name: String.t() | nil,
  ignore?: boolean() | nil,
  location: keyword() | nil,
  format: boolean() | nil
]

t()

@type t() :: %GraphqlQuery.Document{
  document_info: GraphqlQuery.DocumentInfo.t() | nil,
  format: boolean(),
  fragments: [GraphqlQuery.Fragment.t()],
  ignore?: boolean(),
  location: keyword() | nil,
  name: String.t() | nil,
  path: String.t() | nil,
  query: String.t(),
  schema: module() | nil,
  type: :query | :schema,
  variables: map() | keyword()
}

Functions

add_fragment(document, fragment)

@spec add_fragment(t(), GraphqlQuery.Fragment.t() | any()) :: t()

Add a fragment to the document, if it's not a Fragment struct, it will be ignored.

add_fragments(document, fragments)

@spec add_fragments(t(), [GraphqlQuery.Fragment.t() | any()]) :: t()

Add multiple fragments to the document, if they are not Fragment structs, they will be ignored.

add_variable(document, key, value)

@spec add_variable(t(), atom(), any()) :: t()

Add a variable to the document

add_variables(document, variables)

@spec add_variables(t(), map() | keyword()) :: t()

Add multiple variables to the document

calculate_info(document)

@spec calculate_info(document()) :: document()

format_query_with_fragments(document)

@spec format_query_with_fragments(t()) :: String.t()

Format a query with its fragments into a single string.

new(query, opts \\ [])

@spec new(String.t(), new_options()) :: document()

Create a new GraphQL document or fragment from a document string and options.

set_document_info(document, document_info)

@spec set_document_info(document(), GraphqlQuery.DocumentInfo.t() | nil) :: t()

set_name(document, name)

@spec set_name(t(), String.t() | nil) :: t()

Set the name of the document

set_schema(document, schema)

@spec set_schema(t(), module()) :: t()

Set schema to the document