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  }