-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathformulajs_registry.go
More file actions
66 lines (57 loc) · 1.32 KB
/
Copy pathformulajs_registry.go
File metadata and controls
66 lines (57 loc) · 1.32 KB
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
package formula
import (
"bufio"
"bytes"
_ "embed"
"strings"
"sync"
)
//go:embed formulajs_catalog.txt
var formulajsCatalogRaw []byte
var (
builtinRegistryMemo map[string]builtinFunc
builtinRegistryOnce sync.Once
)
func builtinRegistry() map[string]builtinFunc {
builtinRegistryOnce.Do(func() {
builtinRegistryMemo = buildBuiltinRegistry()
})
return builtinRegistryMemo
}
func buildBuiltinRegistry() map[string]builtinFunc {
m := make(map[string]builtinFunc)
put := func(name string, fn builtinFunc) {
n := strings.ToLower(strings.TrimSpace(name))
if n == "" {
return
}
m[n] = fn
}
scan := bufio.NewScanner(bytes.NewReader(formulajsCatalogRaw))
for scan.Scan() {
line := strings.TrimSpace(scan.Text())
if line == "" || strings.HasPrefix(line, "#") {
continue
}
nm := strings.ToLower(line)
if _, exists := m[nm]; exists {
continue
}
put(nm, func(args []string) (string, error) {
return formulajsEmit(nm, args)
})
}
// Hand-tuned implementations (must win over generic formulajs emit).
put("if", builtinIF)
put("and", builtinAND)
put("or", builtinOR)
put("not", builtinNOT)
put("sum", builtinSUM)
put("average", builtinAVERAGE)
put("min", builtinMIN)
put("max", builtinMAX)
put("count", builtinCOUNT)
put("concat", builtinCONCAT)
put("textjoin", builtinTEXTJOIN)
return m
}