README.md

ExNifcloud
================

Description
-----------

パイプライン演算子好きのための Elixir 用 Nifcloud APIs の SDK です。
このリポジトリは、 [ex-aws](https://github.com/ex-aws/ex_aws) を fork して Nifcloud APIs 用に変更しています。


Getting Started
------------

追加したいプロジェクトの `mix.exs` に `:ex_nifcloud` パッケージを追加し、 `mix deps.get` で依存パッケージをインストールします。

```elixir
def deps do
  [
    {:ex_nifcloud, git: "https://github.com/kzmake/ex_nifcloud.git", branch: "master"},
  ]
end
```

`ExNifcloud.Operation.Query` で生成したオペレーションを `ExNifcloud.request` へパイプさせることで Nicloud APIs をリクエストします。

```sh
mix run -e '%ExNifcloud.Operation.Query{
              action: :describe_instances,
              params: %{Action: "DescribeInstances"},
              parser: &ExNifcloud.Utils.identity/2,
              path: "/api/",
              service: :computing
             }
            |> ExNifcloud.request(region: "jp-east-1")
            |> IO.inspect'
```

Install
-------

まだ Hex にあげてない。 github から引っ張ってきて。

```elixir
def deps do
  [
    {:ex_nifcloud, git: "https://github.com/kzmake/ex_nifcloud.git", branch: "master"},
  ]
end
```

Preparation
-----------

Nifcloud APIs を利用するに当たり、 `ACCESS_KEY_ID` と `SECRET_ACCESS_KEY` を設定する必要があります。今のところ設定方法は環境変数だけ。

環境変数 で設定する:

```sh
export ACCESS_KEY_ID="your access key"
export SECRET_ACCESS_KEY="your secret access key"
```

TODO:
そのうち、 `config/*.exs` で優先順位をいい感じに設定できるようにする予定。

```elixir
use Mix.Config

config :ex_nifcloud,
       debug_requests: true,
       access_key_id: [{:system, "ACCESS_KEY_ID"}, {:path, "path/to/credential"}],
       secret_access_key: [{:system, "SECRET_ACCESS_KEY"}, {:path, "path/to/credential"}],
       region: "jp-east-1"
```

Usage
-----

`:ex_nifcloud` パッケージインストール済みのプロジェクトにて `iex -S mix` などで実施できます。

`ExNifcloud.Operation.Query` でリクエストしたいクエリを作成し、 `|>` で `ExNifcloud.request(region: "jp-east-1")` へ渡すことでリクエストします。

```elixir
iex> %ExNifcloud.Operation.Query{
      action: :describe_instances,
      params: %{
        Action: "DescribeInstances"
      },
      parser: &ExNifcloud.Utils.identity/2,
      path: "/api/",
      service: :computing
    } |> ExNifcloud.request(region: "jp-east-1") |> IO.inspect

{:ok,
  %{
    body: "...",
    headers: [...],
    status_code: 200
  }
}
```

`ExNifcloud.Operation.Query` の `:parser` をユーザー独自のパーサーに置き換えることで `ExNifcloud.request` の戻り値を自由に変換することも可能です。

```elixir
iex> defmodule StatusCodeParser do
       def parse({_, res}), do: res.status_code
     end

     %ExNifcloud.Operation.Query{
       action: :describe_instances,
       params: %{Action: "DescribeInstances"},
       parser: &StatusCodeParser.parse/1,
       path: "/api/",
       service: :computing
     } |> ExNifcloud.request

200
```

Requirements
------------

このプロジェクトを実行するには以下が必要です:

* [elixir](https://elixir-lang.org) 1.6.+

Contributing
------------

PR歓迎してます


Support and Migration
---------------------

特に無し

License
-------

- [MIT License](http://petitviolet.mit-license.org/)