-
Notifications
You must be signed in to change notification settings - Fork 43
/
Copy pathapi.go
91 lines (80 loc) · 1.96 KB
/
api.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// Package template implements template functionality for lua.
package template
import (
"fmt"
"io/ioutil"
"sync"
lua "github.com/yuin/gopher-lua"
)
var (
allEngines = make(map[string]luaTemplateEngine, 0)
allEnginesLock = &sync.Mutex{}
)
type luaTemplateEngine interface {
Render(string, *lua.LTable) (string, error)
}
// RegisterTemplateEngine register template engine
func RegisterTemplateEngine(driver string, i luaTemplateEngine) {
allEnginesLock.Lock()
defer allEnginesLock.Unlock()
allEngines[driver] = i
}
func checkEngine(L *lua.LState, n int) luaTemplateEngine {
ud := L.CheckUserData(n)
if v, ok := ud.Value.(luaTemplateEngine); ok {
return v
}
L.ArgError(n, "template expected")
return nil
}
// Choose lua template.get(engine) returns (template_ud, err)
func Choose(L *lua.LState) int {
allEnginesLock.Lock()
defer allEnginesLock.Unlock()
engine := L.CheckString(1)
e, ok := allEngines[engine]
if !ok {
L.Push(lua.LNil)
L.Push(lua.LString(fmt.Sprintf("unknown template engine: %s", engine)))
return 2
}
ud := L.NewUserData()
ud.Value = e
L.SetMetatable(ud, L.GetTypeMetatable(`template_ud`))
L.Push(ud)
return 1
}
// Render lua template_ud:render(string, values) returns (string, err)
func Render(L *lua.LState) int {
t := checkEngine(L, 1)
body := L.CheckString(2)
context := L.CheckTable(3)
result, err := t.Render(body, context)
if err != nil {
L.Push(lua.LNil)
L.Push(lua.LString(err.Error()))
return 2
}
L.Push(lua.LString(result))
return 1
}
// RenderFile lua template_ud:render(string, values) returns (string, err)
func RenderFile(L *lua.LState) int {
t := checkEngine(L, 1)
file := L.CheckString(2)
context := L.CheckTable(3)
body, err := ioutil.ReadFile(file)
if err != nil {
L.Push(lua.LNil)
L.Push(lua.LString(err.Error()))
return 2
}
result, err := t.Render(string(body), context)
if err != nil {
L.Push(lua.LNil)
L.Push(lua.LString(err.Error()))
return 2
}
L.Push(lua.LString(result))
return 1
}