README.md

# Flagsmith.SDK

Elixir SDK to interact with `Flagsmith` API.
Includes functions and types wrapping the API functionality, schemas and responses.

## Installation

Add to your `mix.exs` `deps`:

### github only while developing
```elixir
def deps do
  [
    {:flagsmith_elixir_sdk, "~> 0.1"}
  ]
end
```

## Configuration

You can configure the SDK per environment using a static default config, for instance in your `config/config.exs` adding:

```elixir
config :flagsmith_elixir_sdk, :sdk,
       environment_key: "YOUR-ENV-KEY"
```

You can also configure the base url path to use in case you're not using the public API:

```elixir
config :flagsmith_elixir_sdk, :sdk,
       environment_key: "YOUR-ENV-KEY",
       base_url: "YOUR-BASE-URL"
```

For runtime configuration you can create a client struct manually and pass it as the first argument to whatever SDK function you want to call:

```elixir
{:ok, sdk_client} = Flagsmith.SDK.new("YOUR-ENV-KEY")

Flagsmith.SDK.API.flags_list(sdk_client)

### sample response ###
{:ok, [
   %Flagsmith.API.FeatureStateSerializerFull{
     enabled: false,
     environment: 11278,
     feature: %Flagsmith.API.Feature{
       created_date: ~U[2021-10-24 13:40:02Z],
       default_enabled: false,
       description: "Header Size",
       id: 13534,
       initial_value: "24px",
       name: "header_size",
       type: "MULTIVARIATE"
     },
     feature_segment: nil,
     feature_state_value: "24px",
     id: 72267,
     identity: nil
   },
   %Flagsmith.API.FeatureStateSerializerFull{
     enabled: false,
     environment: 11278,
     feature: %Flagsmith.API.Feature{
       created_date: ~U[2021-10-24 13:41:35Z],
       default_enabled: false,
       description: nil,
       id: 13535,
       initial_value: "18px",
       name: "body_size",
       type: "STANDARD"
     },
     feature_segment: nil,
     feature_state_value: "18px",
     id: 72269,
     identity: nil
   }
 ]}
```

`Flagsmith.SDK.new/2` accepts the base url as the second argument.

## HTTP Client

Underneath the SDK uses [Tesla](https://github.com/teamon/tesla), so you can customise which adapter you want to use. Refer to `Tesla`'s decumentation for additional context.

The default HTTP adapter is Erlang's `httpc`, to use instead, for instance, `hackney`, and the same for any other of the supported clients, add to your deps the correct dependency:

```elixir
defp deps do
  [
    # ...
    {:hackney, "~> 1.17"}
  ]
end
```

and to your `config/config.exs` the adapter module

```elixir
config :tesla, adapter: Tesla.Adapter.Hackney
```