# Cubex

[Cube]( client for Elixir

## Installation

Adding `cubex` to your list of dependencies in `mix.exs`:

def deps do
    {:cubex, "~> 0.2.1"}

## Usage

The docs can be found at <>.

# create a client using a jwt directly
client = my_cube_base_url, token: my_cube_jwt)

# create a client using a secret, which generates jwts
client = my_cube_base_url, secret: my_cube_api_secret)

# create a client using a secret with extra claims
client =
  url: my_cube_base_url, 
  secret: my_cube_api_secret, 
  claims: %{"claimname" => "claimvalue"})

query = %{"dimensions" => ...}

# load data
{:ok, result} = Cubex.load(client, query)

# pass your own request id
{:ok, result} = Cubex.load(client, query, request_id: my_api_request_id)

# manually handle `Continue wait` in your own code
{:ok, result} = Cubex.load(client, query, 
  request_id: my_api_request_id, 
  sequence_id: 1,
  continue_wait: false) # defaults to true

case result do
  %{"error" => "Continue wait"} ->
    # make the same call again and increment the sequence_id
  data ->
    # got the data back, or a real error

# get the sql
{:ok, result} = Cubex.sql(client, query)

# fetch metadata
{:ok, result} = Cubex.meta(client)

## Configuration

`Cubex.Rest` uses [Tesla]( under the hood, so any Tesla options can be configured in your application configuration.

# options can also be passed to new/1

# configure cubex rest with a token
config :cubex, Cubex.Rest,
  base_url: "https://my-cube-server",
  token: "jwt",
  user_agent: "MyCubeClient"

# configure cubex with a secret for generating jwts on the fly
config :cubex, Cubex.Rest,
  base_url: "https://my-cube-server",
  secret: "signing secret"

# override the underlying implementation. also useful for testing
config :cubex, :client, MyApp.CubexGraphql