README.md

# HXL

---

![CI](https://github.com/drowzy/hxl/actions/workflows/ci.yml/badge.svg)
[![Hex.pm Version](https://img.shields.io/hexpm/v/hxl.svg?style=flat-square)](https://hex.pm/packages/hxl)

An Elixir implementation of [HCL](https://github.com/hashicorp/hcl)

## Features

* Decode from string or file
* Aims to be fully compliant with the [HCL](https://github.com/hashicorp/hcl/blob/main/hclsyntax/spec.md) specification
* Function & variables support during evaluation

## Example Usage

```elixir
hcl = """
resource "upcloud_server" "server1" {
  hostname = "terraform.example.com"

  zone = "nl-ams1"

  plan = "1xCPU-1GB"

  template {
    size = 25
    storage = "01000000-0000-4000-8000-000030200200"
  }

  network_interface {
    type = "public"
  }

  login {
    user = "root"
    keys = [
      "ssh-rsa public key",
    ]
    create_password = true
    password_delivery = "email"
  }

  connection {
    host        = "127.0.0.2"
    type        = "ssh"
    user        = "root"
    private_key = file("~/.ssh/rsa_private_key")
  }

  provisioner "remote-exec" {
    inline = [
      "echo 'Hello world!'"
    ]
  }
}
"""

{:ok, config_file} = HXL.decode(hcl, functions: %{"file" => &File.read/1})
```

### From file

```elixir
{:ok, config_file} = HXL.decode_file("/path/to/file")
```

### As ast

```elixir
hcl = """
service "http" {
  a = 1
  b = 2
}
"""

{:ok %HXL.Body{}} = HXL.decode_as_ast(hcl)

```

## Installation

Add `hxl` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:hxl, "~> 0.1.0"}
  ]
end
```

## HCL Syntax Specification

### [Lexical Elements](https://github.com/hashicorp/hcl/blob/main/hclsyntax/spec.md#lexical-elements)

- [x] Comments
- [x] Identifiers
- [x] Operators & delimiters
- [x] Numeric literals

### [Structural Language](https://github.com/hashicorp/hcl/blob/main/hclsyntax/spec.md#structural-elements)

- [x] Body
- [x] Attributes
- [x] Blocks
- [x] One-line blocks

### [Expression language](https://github.com/hashicorp/hcl/blob/main/hclsyntax/spec.md#expressions)

- [x] Expressions
  - [x] Expr term
    - [x] Literal Value
    - [x] Collection Value
    - [x] Template Expr
    - [x] Variable Expr
    - [x] Function Call
    - [x] For Expr
    - [x] ExprTerm Index
    - [x] ExprTerm GetAttr
    - [x] ExprTerm Splat
    - [x] "(" Expression ")"
  - [x] Operation
  - [x] Conditional

### [Template Language](https://github.com/hashicorp/hcl/blob/main/hclsyntax/spec.md#templates)
- [] TemplateLiteral
- [] TemplateInterpolation
- [] TemplateDirective

### Representations
 - [x] HCL Native syntax
 - [ ] JSON