github.com/kolbycrouch/elvish@v0.14.1-0.20210614162631-215b9ac1c423/pkg/edit/vars.go (about) 1 package edit 2 3 import ( 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 10 func initVarsAPI(ed *Editor, nb eval.NsBuilder) { 11 nb.AddGoFns("<edit>:", map[string]interface{}{ 12 "add-var": addVar, 13 "add-vars": addVars, 14 }) 15 } 16 17 //elvdoc:fn add-var 18 // 19 // ```elvish 20 // edit:add-var $name $value 21 // ``` 22 // 23 // Declares a new variable in the REPL. The new variable becomes available 24 // during the next REPL cycle. 25 // 26 // Equivalent to running `var $name = $value` at the REPL, but `$name` can be 27 // dynamic. 28 // 29 // Example: 30 // 31 // ```elvish-transcript 32 // ~> edit:add-var foo bar 33 // ~> put $foo 34 // ▶ bar 35 // ``` 36 37 func addVar(fm *eval.Frame, name string, val interface{}) error { 38 if !eval.IsUnqualified(name) { 39 return errs.BadValue{ 40 What: "name argument to edit:add-var", 41 Valid: "unqualified variable name", Actual: name} 42 } 43 variable := eval.MakeVarFromName(name) 44 err := variable.Set(val) 45 if err != nil { 46 return err 47 } 48 fm.Evaler.AddGlobal(eval.NsBuilder{name: vars.FromInit(val)}.Ns()) 49 return nil 50 } 51 52 //elvdoc:fn add-vars 53 // 54 // ```elvish 55 // edit:add-vars $map 56 // ``` 57 // 58 // Takes a map from strings to arbitrary values. Equivalent to calling 59 // `edit:add-var` for each key-value pair in the map. 60 61 func addVars(fm *eval.Frame, m vals.Map) error { 62 nb := eval.NsBuilder{} 63 for it := m.Iterator(); it.HasElem(); it.Next() { 64 k, val := it.Elem() 65 name, ok := k.(string) 66 if !ok { 67 return errs.BadValue{ 68 What: "key of argument to edit:add-vars", 69 Valid: "string", Actual: vals.Kind(k)} 70 } 71 if !eval.IsUnqualified(name) { 72 return errs.BadValue{ 73 What: "key of argument to edit:add-vars", 74 Valid: "unqualified variable name", Actual: name} 75 } 76 variable := eval.MakeVarFromName(name) 77 err := variable.Set(val) 78 if err != nil { 79 return err 80 } 81 nb[name] = variable 82 } 83 fm.Evaler.AddGlobal(nb.Ns()) 84 return nil 85 }