vars.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package edit
  2. import (
  3. "strings"
  4. "src.elv.sh/pkg/eval"
  5. "src.elv.sh/pkg/eval/errs"
  6. "src.elv.sh/pkg/eval/vals"
  7. "src.elv.sh/pkg/eval/vars"
  8. )
  9. func initVarsAPI(ed *Editor, nb eval.NsBuilder) {
  10. nb.AddGoFns(map[string]any{
  11. "add-var": addVar,
  12. "add-vars": addVars,
  13. })
  14. }
  15. func addVar(fm *eval.Frame, name string, val any) error {
  16. if !isUnqualified(name) {
  17. return errs.BadValue{
  18. What: "name argument to edit:add-var",
  19. Valid: "unqualified variable name", Actual: name}
  20. }
  21. variable := eval.MakeVarFromName(name)
  22. err := variable.Set(val)
  23. if err != nil {
  24. return err
  25. }
  26. fm.Evaler.ExtendGlobal(eval.BuildNs().AddVar(name, vars.FromInit(val)))
  27. return nil
  28. }
  29. func addVars(fm *eval.Frame, m vals.Map) error {
  30. nb := eval.BuildNs()
  31. for it := m.Iterator(); it.HasElem(); it.Next() {
  32. k, val := it.Elem()
  33. name, ok := k.(string)
  34. if !ok {
  35. return errs.BadValue{
  36. What: "key of argument to edit:add-vars",
  37. Valid: "string", Actual: vals.Kind(k)}
  38. }
  39. if !isUnqualified(name) {
  40. return errs.BadValue{
  41. What: "key of argument to edit:add-vars",
  42. Valid: "unqualified variable name", Actual: name}
  43. }
  44. variable := eval.MakeVarFromName(name)
  45. err := variable.Set(val)
  46. if err != nil {
  47. return err
  48. }
  49. nb.AddVar(name, variable)
  50. }
  51. fm.Evaler.ExtendGlobal(nb)
  52. return nil
  53. }
  54. func isUnqualified(name string) bool {
  55. i := strings.IndexByte(name, ':')
  56. return i == -1 || i == len(name)-1
  57. }