Module Template

Example use of this module

    module Items = struct
        type t = string list

        let to_key_value_pairs items =
        let items =
            List.map ~f:(fun item -> Printf.sprintf "- %s" item) items
            |> String.concat ~sep:"\n"
        in
        [ "items", items ]
        ;;
    end
    
    module ItemsTemplate = Make (Items) 
    module Person = struct
        type t =
        { name : string
        ; age : int
        ; items : string list
        }

        let items_template = ItemsTemplate.create {|items
    -----------
    {{items}}|}

        let to_key_value_pairs person =
        [ "name", person.name
        ; "age", Int.to_string person.age
        ; "items", ItemsTemplate.render items_template person.items
        ]
        ;;
    end
    
    module PersonTemplate = Make (Person) 
    let template =
        PersonTemplate.create
        {|
    Hello, {{ name }}! 
    Your age is {{ age }}.
    What do You need from this list 
    {{items}}
    |}
    
    let person =
        { Person.name = "John Doe"; age = 30; items = [ "milk"; "eggs"; "toast" ] }
    
    let rendered = PersonTemplate.render template person
    let () = printf "%s\n" rendered;
    
   "Hello, John Doe!
    Your age is 30.
    What do You need from this list
    items
    -----------
    - milk
    - eggs
    - toast"
module type RENDERABLE = sig ... end

The RENDERABLE module type defines an interface for types that can be converted to key-value pairs for use in templating.

module Make_Template (R : RENDERABLE) : sig ... end

The Make functor creates a templating module for a given RENDERABLE type. Supports variable replacement with the syntax {{variable}}

module type PARSABLE = sig ... end
module Make_parser (P : PARSABLE) : sig ... end