1
1
module Falco.Scriban.Program
2
2
3
+ open System
3
4
open System.IO
4
5
open System.Threading .Tasks
5
6
open Falco
6
7
open Falco.Routing
7
8
open Falco.HostBuilder
8
- open Microsoft.Extensions .DependencyInjection
9
9
open Scriban
10
10
11
- // ------------
12
- // View Engine
13
- // ------------
14
- type IViewEngine =
15
- abstract member RenderAsync : view : string * model : 'a -> ValueTask < string >
16
-
17
- type ScribanViewEngine ( views : Map < string , Template >) =
18
- interface IViewEngine with
19
- member _.RenderAsync ( view : string , model : 'a ) =
20
- match Map.tryFind view views with
21
- | Some template -> template.RenderAsync( model)
22
- | None -> failwithf " View '%s ' was not found" view
11
+ type RenderTemplate = string -> obj -> ValueTask< string>
23
12
24
13
// ------------
25
14
// Pages
26
15
// ------------
27
16
module Pages =
28
- let homepage : HttpHandler =
29
- Services.inject< IViewEngine> ( fun viewEngine ->
30
- let queryMap ( q : QueryCollectionReader ) =
31
- {| Name = q.Get " name" |}
17
+ let homepage ( renderTemplate : RenderTemplate ) : HttpHandler =
18
+ let queryMap ( q : QueryCollectionReader ) =
19
+ {| Name = q.Get " name" |}
32
20
33
- let next model : HttpHandler = fun ctx ->
34
- task {
35
- let! html = viewEngine.RenderAsync ( " Home" , model)
36
- return Response.ofHtmlString html ctx
37
- }
21
+ let next model : HttpHandler = fun ctx ->
22
+ task {
23
+ let! html = renderTemplate " Home" model
24
+ return Response.ofHtmlString html ctx
25
+ }
38
26
39
- Request.mapQuery queryMap next)
27
+ Request.mapQuery queryMap next
40
28
41
29
// ------------
42
- // Services
30
+ // App
43
31
// ------------
44
- let scribanService scribanTemplates ( svc : IServiceCollection ) =
45
- svc.AddScoped< IViewEngine, ScribanViewEngine>( fun _ ->
46
- new ScribanViewEngine( scribanTemplates))
47
-
48
- [<EntryPoint>]
49
- let main args =
50
- let scribanTemplates =
51
- let root = Directory.GetCurrentDirectory()
52
- let viewsDirectory = Path.Combine( root, " Views" )
53
-
54
- Directory.EnumerateFiles( viewsDirectory)
32
+ module Template =
33
+ let loadFrom ( path : string ) =
34
+ Directory.EnumerateFiles( path)
55
35
|> Seq.map ( fun file ->
56
36
let viewName = Path.GetFileNameWithoutExtension( file)
57
37
let viewContent = File.ReadAllText( file)
58
38
let view = Template.Parse( viewContent)
59
39
viewName, view)
60
40
|> Map.ofSeq
61
41
42
+ let render ( templates : Map < string , Template >) ( name : string ) ( model : obj ) =
43
+ match Map.tryFind name templates with
44
+ | Some template -> template.RenderAsync( model)
45
+ | None -> failwithf " Template '%s ' was not found" name
62
46
63
- webHost [||] {
64
- use_ https
47
+ [<EntryPoint>]
48
+ let main args =
49
+ let executionDirectory = Path.GetDirectoryName( Environment.GetCommandLineArgs()[ 0 ])
50
+ let scribanTemplates = Template.loadFrom ( Path.Combine( executionDirectory, " Views" ))
51
+ let renderTemplate = Template.render scribanTemplates
65
52
66
- add_ service ( scribanService scribanTemplates)
53
+ webHost args {
54
+ use_ https
67
55
68
56
endpoints [
69
- get " /" Pages.homepage
57
+ get " /" ( Pages.homepage renderTemplate )
70
58
]
71
59
}
72
60
73
- 0 // Exit code
61
+ 0
0 commit comments