open System open System.IO open Suave open Suave.Web open Suave.Http open Suave.Types open Suave.Http.Successful open DotLiquid open Microsoft.FSharp.Reflection // [snippet:DotLiquid template integration for Suave] let parseTemplate<'T> template = let rec registerTypeTree ty = if FSharpType.IsRecord ty then let fields = FSharpType.GetRecordFields(ty) Template.RegisterSafeType(ty, [| for f in fields -> f.Name |]) for f in fields do registerTypeTree f.PropertyType elif ty.IsGenericType && ( let t = ty.GetGenericTypeDefinition() in t = typedefof> || t = typedefof> ) then () //registerTypeTree (ty.GetGenericArguments().[0]) registerTypeTree (ty.GetGenericArguments().[0]) else () (* printfn "%s" ty.FullName *) registerTypeTree typeof<'T> let t = Template.Parse(template) fun k (v:'T) -> t.Render(Hash.FromDictionary(dict [k, box v])) // [/snippet] // [snippet:Simple demo] type Task = { What : string } type Person = { Name : string Tasks : seq } let t = parseTemplate """

{{ user.Name }} has to do:

    {% for item in user.Tasks -%}
  • {{ item.What }}
  • {% endfor -%}
""" let app = OK (t "user" {Name="Tomas"; Tasks = [ {What="sleep"}; {What="eat"} ]}) // [/snippet]