# ExBCS
[BCS](https://github.com/diem/bcs) encoder in Elixir.
Decoder is still WIP.
## Installation
The package can be installed by adding `ex_bcs` to your list of dependencies in `mix.exs`:
```elixir
def deps do
[
{:bcs, "~> 0.1.0", hex: :ex_bcs}
]
end
```
Documentation can be found at <https://hexdocs.pm/ex_bcs>.
## Usage
Use data types in the `BCS.DataType` module to declare the data types.
It is recommended to `alias BCS.DataType, as: T` for convenience.
For example:
```elixir
alias BCS.DataType, as: T
# Encode 100 as an uint8
BCS.encode(100, T.UInt.t(8))
# Encoode 314159 as an uint64
BCS.encode(314159, T.UInt.t(64))
# Encode "Hello world" as a string
BCS.encode("Hello world", T.Str.t())
# Encode {2, True, "too true"} as a tuple containing an uint64, a boolean, and a string
BCS.encode({2, True, "too true"}, T.Tuple.t([T.UInt.t(64), T.Bool.t(), T.Str.t()])
# Encode a struct
data = %{name: "Tom", age: 17}
layout = [name: T.Str.t(), age: T.UInt.t(8)]
BCS.encode(data, T.Struct.t(layout))
# Encode a choice type by specifying the variant index and the inner type
BCS.encode(%Result.Ok{value: 100_000}, T.Choice.t(T.UInt.t(64), 0))
BCS.encode(%Result.Err{value: "forbidden"}, T.Choice.t(T.Str.t(), 1))
```