Orasund/elm-handlebars/1.0.1

NOTE: the latest version is 1.0.2

Handlebars.Expression

A Handlebar template is composed out of expression.

type alias BlockHelper =
{ arg : Value
, throw : String -> Error
, content : Path -> Result Error String
}
-> Path
-> Result Error String

Block Helper

type alias Config =
{ expHelpers : Dict String ExpHelper
, blockHelpers : Dict String BlockHelper
, root : Path
}

The config can be used to extend the helpers.

type Error
= StringExpected ( SubExp, Value )
| CollectionExpected Path RelativePath
| BlockHelperNotFound String
| FromBlockHelper
{ helper : String
, error : String
}
| PathNotValid Path RelativePath
| PathNotFound Path
| HelperNotFound String
| FromHelper
{ helper : String
, error : String
}

Evaluation Errors

type alias ExpHelper =
List Value -> Result String Value

Expression Helper

= Text String
| Variable SubExp
| For RelativePath (List Expression)
| Block String SubExp (List Expression)

Expression

type SubExp
= LookUp RelativePath
| Helper String ( SubExp, List SubExp )

Sub expressions

evalExp : Config -> Expression -> Value -> Result Error String

Evaluate a value based on a template

import Dict
import Handlebars.Value exposing (Value(..))
import Handlebars
import Array


jack : Value
jack =
    StringValue "jack"


value : Value
value =
    [ ( "name", jack )
    , ( "key", StringValue "name" )
    , ( "valid", BooleanValue True)
    , ( "people",
        [ StringValue "jack" , StringValue "gill" ]
        |> Array.fromList
        |> ArrayValue
    )
    ]
        |> Dict.fromList
        |> ObjectValue


evalExp Handlebars.defaultConfig
    ("Hello World"
        |> Text
    )
    value
    --> Ok "Hello World"


evalExp Handlebars.defaultConfig
    ( (0,["name"])
        |> LookUp
        |> Variable
    )
    value
    --> Ok "jack"


evalExp Handlebars.defaultConfig
    ( Helper "equals"
        ( LookUp (0,[ "name"])
        , [ LookUp (0,[ "key"]) ]
        )
        |> Variable
    )
    value
    |> (\err ->
        case err of
            Err (StringExpected _) ->
                True
            _ ->
                False
        )
    --> True


evalExp Handlebars.defaultConfig
    ( For (0,["people"])
        [(0,[ "@index"]) |> LookUp |> Variable]
    )
    value
    --> Ok "01"


evalExp Handlebars.defaultConfig
    ( Block "if" (LookUp (0,["valid"]))
        [Text "Hello"]
    )
    value
    --> Ok "Hello"


evalExp Handlebars.defaultConfig
    ( Block "invalid" (LookUp (0,[]))
        [Text "Hello"]
    )
    value
    --> Err (BlockHelperNotFound "invalid")
evalSubExp : Config -> Value -> SubExp -> Result Error Value

Evaluate a subexpression

import Dict
import Handlebars exposing (defaultConfig)
import Handlebars.Value exposing (Value(..))


expression : Expression
expression =
    Text ""


jack : Value
jack =
    StringValue "jack"


value : Value
value =
    [ ( "name", jack )
    , ( "key", StringValue "name" )
    ]
        |> Dict.fromList
        |> ObjectValue

Simplest subexpression is a look up to a relative path.

LookUp (0,["name"])
    |> evalSubExp defaultConfig value
    --> Ok jack


LookUp (0,["job"])
    |> evalSubExp defaultConfig  value
    --> Err (PathNotFound ["job"])


LookUp (1,[])
    |> evalSubExp defaultConfig value
    --> Err (PathNotValid [] (1,[]))


LookUp (1,[])
    |> evalSubExp {defaultConfig | root = ["name"]} value
    --> Ok value

Helper can also be used inside of subexpression.

Helper "lookup" ( LookUp (0,[]), [LookUp (0,[ "key" ])] )
    |> evalSubExp defaultConfig value
    --> Ok jack


Helper "lookup" ( LookUp (0,[ "name"]), [LookUp (0,[ "key" ])] )
    |> evalSubExp defaultConfig value
    |> (\err ->
        case err of
            Err (FromHelper args) ->
                args.helper == "lookup"
            _ ->
                False
    )
    --> True


Helper "lookup" (LookUp (0,[]),[])
    |> evalSubExp defaultConfig value
    |> (\err ->
        case err of
            Err (FromHelper args) ->
                args.helper == "lookup"
            _ ->
                False
    )
    --> True