README.md

# dig

[![Package Version](https://img.shields.io/hexpm/v/dig?color=92DCE5)](https://hex.pm/packages/dig)
[![Hex Docs](https://img.shields.io/badge/hex-docs-ffaff3?color=FCC0D2)](https://hexdocs.pm/dig/)

✨ Parse path expression as [dynamic.Decoder](https://hexdocs.pm/gleam_stdlib/gleam/dynamic.html#Decoder)

## Installation

To add this package to your Gleam project:

```sh
gleam add dig
```

## Usage

```gleam
import gleeunit
import gleeunit/should
import dig
import gleam/option.{None, Some}
import gleam/json
import gleam/dynamic
import gleam/string
import gleam/list
import gleam/io

pub fn dig_test() {
  let json_str =
    "
  {
    \"foo\": [
      {
        \"bar\": [
          {
            \"baz\": \"a\"
          },
          {
            \"baz\": \"b\"
          }
        ]
      },
      {
        \"bar\": [
           {
            \"baz\": \"c\"
          },
          {
            \"baz\": \"d\"
          }
        ]
      }
    ],
    \"haha\": {
      \"meme\": 1
    }
  }
  "

  {
    let assert Ok(dig.DigObject(path, decoder)) =
      dig.dig(
        "foo[1].bar[1].baz"
        |> string.split("."),
      )

    should.equal(path, ["foo[1]", "bar[1]", "baz"])

    let assert Ok(d) =
      json_str
      |> json.decode(decoder)

    d
    |> dynamic.string()
    |> should.equal(Ok("d"))
  }

  {
    let assert Ok(dig.DigList(path, decoder)) =
      dig.dig(
        "foo[].bar[].baz"
        |> string.split("."),
      )

    should.equal(path, ["foo[]", "bar[]", "baz"])

    let assert Ok(d) =
      json_str
      |> json.decode(decoder)

    d
    |> list.map(dynamic.string)
    |> should.equal([Ok("a"), Ok("b"), Ok("c"), Ok("d")])
  }

  {
    let assert Ok(dig.DigList(path, decoder)) =
      dig.dig(
        "foo[].miss_me[1].baz"
        |> string.split("."),
      )

    should.equal(path, ["foo[]", "miss_me[1]", "baz"])

    let r =
      json_str
      |> json.decode(decoder)

    case r {
      Ok(_) -> should.fail()
      Error(errors) -> {
        io.debug(errors)
        Nil
      }
    }
  }
}
```