README.md

# ExIpfsIpld

[![IPLD unit and integration tests](https://github.com/bahner/ex-ipld/actions/workflows/testsuite.yaml/badge.svg)](https://github.com/bahner/ex-ipld/actions/workflows/testsuite.yaml)
[![Coverage Status](https://coveralls.io/repos/github/bahner/ex-ipld/badge.svg?branch=main)](https://coveralls.io/github/bahner/ex-ipld?branch=main)

Elixir IPLD module. IPLD is linked data, so that you can build tree structures built up of discrete units (DAG). To learn more about IPLD visit https://ipld.io

You can for example add a pseudo structure like:

```json
{"Key": "Value", "List": [0, 1, 2, 3, 4, 5, 6]}
```
And add it to IPFS like this:

```elixir
iex(8)> json_string = "{\"Key\": \"Value\", \"List\": [0, 1, 2, 3, 4, 5, 6]}"
iex(9)> ExIpfsIpld.put(json_string)
{:ok,
 %ExIpfs.Link{/: "bafyreiflv5ldmhgxcdrixvdmh3sqoskooub76obvqwiabcekhvapk2kadi"}}
Iex(10)> ExIpfsIpld.get("bafyreiflv5ldmhgxcdrixvdmh3sqoskooub76obvqwiabcekhvapk2kadi/List/1")
{:ok, 1}
```

The data is structured, so that you can query the elements in the original data and data can be linked, like this:

```elixir
iex(19)> readme_ref = %{"Link": %{"/": "bafyreiflv5ldmhgxcdrixvdmh3sqoskooub76obvqwiabcekhvapk2kadi"}}
%{Link: %{/: "bafyreiflv5ldmhgxcdrixvdmh3sqoskooub76obvqwiabcekhvapk2kadi"}}
iex(20)> ExIpfsIpld.put(Jason.encode!(readme_ref))
{:ok,
 %ExIpfs.Link{/: "bafyreifwbyb5niiy2znptlz4cnltyo24pc2mlzjalfh7e2vlwy4wjvzdte"}}
iex(21)> ExIpfsIpld.get("bafyreifwbyb5niiy2znptlz4cnltyo24pc2mlzjalfh7e2vlwy4wjvzdte/Link/Key")
{:ok, "Value"}
iex(22)>
```

That's pretty cool :-)

## Installation

If [available in Hex](https://hex.pm/docs/publish), the package can be installed
by adding `ex_ipld` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:ex_ipfs_ipld, "~> 1.0.0"}
  ]
end
```

Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc)
and published on [HexDocs](https://hexdocs.pm). Once published, the docs can
be found at <https://hexdocs.pm/ex_ipld>.