defmodule Cognac do @moduledoc """ """ alias Cognac.Query @doc """ Convert keyword list/tuple list to GraphQL query string ```elixir iex> query = [hero: [:name, friends: [:name]]] iex> Cognac.query(query) "query{hero{name friends{name}}}" ``` ## Options * `:output` * `:string` (default) - Outputs query as string * `:iodata` - Outputs as query data * `pretty` * `false` (default) - Outputs minimal query * `true` - Outputs prettified query with indentation and linebreaks """ @spec query(list() | keyword()) :: binary() | iodata() def query(query, options \\ []) do ["query", Query.build(query, options)] |> binary_or_iodata(options) end @doc """ Convert keyword list/tuple list to GraphQL mutation query string ```elixir iex> mutation = [hero: [:name, friends: [:name]]] iex> Cognac.mutation(mutation) "mutation{updateHero(name:\"Steve\"){name}}" ``` ## Options * `:output` * `:string` (default) - Outputs query as string * `:iodata` - Outputs as query data * `pretty` * `false` (default) - Outputs minimal query * `true` - Outputs prettified query with indentation and linebreaks """ @spec mutation(list() | keyword()) :: binary() | iodata() def mutation(query, options \\ []) do ["mutation", Query.build(query, options)] |> binary_or_iodata(options) end @doc """ Convert keyword list/tuple list to GraphQL subscription query string ```elixir iex> subscription = [heroUpdated: [:name]] iex> Cognac.subscription(subscription) "subscription{heroUpdated{name}}" ``` ## Options * `:output` * `:string` (default) - Outputs query as string * `:iodata` - Outputs as query data * `pretty` * `false` (default) - Outputs minimal query * `true` - Outputs prettified query with indentation and linebreaks """ @spec subscription(list() | keyword()) :: binary() | iodata() def subscription(query, options \\ []) do ["subscription", Query.build(query, options)] |> binary_or_iodata(options) end defp binary_or_iodata(iodata, options) do case options[:output] do :iodata -> iodata :binary -> IO.iodata_to_binary(iodata) _ -> IO.iodata_to_binary(iodata) end end end