// Package hcl contains the main modelling types and general utility functions
// for HCL.
//
// For a simple entry point into HCL, see the package in the subdirectory
// "hclsimple", which has an opinionated function Decode that can decode HCL
// configurations in either native HCL syntax or JSON syntax into a Go struct
// type:
//
//     package main
//
//     import (
//     	"log"
//     	"github.com/hashicorp/hcl/v2/hclsimple"
//     )
//
//     type Config struct {
//     	LogLevel string `hcl:"log_level"`
//     }
//
//     func main() {
//     	var config Config
//     	err := hclsimple.DecodeFile("config.hcl", nil, &config)
//     	if err != nil {
//     		log.Fatalf("Failed to load configuration: %s", err)
//     	}
//     	log.Printf("Configuration is %#v", config)
//     }
//
// If your application needs more control over the evaluation of the
// configuration, you can use the functions in the subdirectories hclparse,
// gohcl, hcldec, etc. Splitting the handling of configuration into multiple
// phases allows for advanced patterns such as allowing expressions in one
// part of the configuration to refer to data defined in another part.
package hcl
