-
-
Notifications
You must be signed in to change notification settings - Fork 299
/
vars.go
95 lines (87 loc) · 2.2 KB
/
vars.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
92
93
94
95
package edit
import (
"strings"
"src.elv.sh/pkg/eval"
"src.elv.sh/pkg/eval/errs"
"src.elv.sh/pkg/eval/vals"
)
func initVarsAPI(nb eval.NsBuilder) {
nb.AddGoFns(map[string]any{
"add-var": addVar,
"add-vars": addVars,
"del-var": delVar,
"del-vars": delVars,
})
}
func addVar(fm *eval.Frame, name string, val any) error {
if !isUnqualified(name) {
return errs.BadValue{
What: "name argument to edit:add-var",
Valid: "unqualified variable name", Actual: name}
}
variable := eval.MakeVarFromName(name)
err := variable.Set(val)
if err != nil {
return err
}
fm.Evaler.ExtendGlobal(eval.BuildNs().AddVar(name, variable))
return nil
}
func delVar(fm *eval.Frame, name string) error {
if !isUnqualified(name) {
return errs.BadValue{
What: "name argument to edit:del-var",
Valid: "unqualified variable name", Actual: name}
}
fm.Evaler.DeleteFromGlobal(map[string]struct{}{name: {}})
return nil
}
func addVars(fm *eval.Frame, m vals.Map) error {
nb := eval.BuildNs()
for it := m.Iterator(); it.HasElem(); it.Next() {
k, val := it.Elem()
name, ok := k.(string)
if !ok {
return errs.BadValue{
What: "key of argument to edit:add-vars",
Valid: "string", Actual: vals.Kind(k)}
}
if !isUnqualified(name) {
return errs.BadValue{
What: "key of argument to edit:add-vars",
Valid: "unqualified variable name", Actual: name}
}
variable := eval.MakeVarFromName(name)
err := variable.Set(val)
if err != nil {
return err
}
nb.AddVar(name, variable)
}
fm.Evaler.ExtendGlobal(nb)
return nil
}
func delVars(fm *eval.Frame, m vals.List) error {
names := make(map[string]struct{}, m.Len())
for it := m.Iterator(); it.HasElem(); it.Next() {
n := it.Elem()
name, ok := n.(string)
if !ok {
return errs.BadValue{
What: "element of argument to edit:del-vars",
Valid: "string", Actual: vals.Kind(n)}
}
if !isUnqualified(name) {
return errs.BadValue{
What: "element of argument to edit:del-vars",
Valid: "unqualified variable name", Actual: name}
}
names[name] = struct{}{}
}
fm.Evaler.DeleteFromGlobal(names)
return nil
}
func isUnqualified(name string) bool {
i := strings.IndexByte(name, ':')
return i == -1 || i == len(name)-1
}