src.elv.sh@v0.21.0-dev.0.20240515223629-06979efb9a2a/pkg/edit/instant.go (about)

     1  package edit
     2  
     3  import (
     4  	"src.elv.sh/pkg/cli"
     5  	"src.elv.sh/pkg/cli/modes"
     6  	"src.elv.sh/pkg/cli/tk"
     7  	"src.elv.sh/pkg/eval"
     8  	"src.elv.sh/pkg/parse"
     9  )
    10  
    11  func initInstant(ed *Editor, ev *eval.Evaler, nb eval.NsBuilder) {
    12  	bindingVar := newBindingVar(emptyBindingsMap)
    13  	bindings := newMapBindings(ed, ev, bindingVar)
    14  	nb.AddNs("-instant",
    15  		eval.BuildNsNamed("edit:-instant").
    16  			AddVar("binding", bindingVar).
    17  			AddGoFns(map[string]any{
    18  				"start": func() { instantStart(ed.app, ev, bindings) },
    19  			}))
    20  }
    21  
    22  func instantStart(app cli.App, ev *eval.Evaler, bindings tk.Bindings) {
    23  	execute := func(code string) ([]string, error) {
    24  		outPort, collect, err := eval.StringCapturePort()
    25  		if err != nil {
    26  			return nil, err
    27  		}
    28  		ctx, done := eval.ListenInterrupts()
    29  		err = ev.Eval(
    30  			parse.Source{Name: "[instant]", Code: code},
    31  			eval.EvalCfg{Ports: []*eval.Port{nil, outPort}, Interrupts: ctx})
    32  		done()
    33  		return collect(), err
    34  	}
    35  	w, err := modes.NewInstant(app,
    36  		modes.InstantSpec{Bindings: bindings, Execute: execute})
    37  	if w != nil {
    38  		app.PushAddon(w)
    39  		app.Redraw()
    40  	}
    41  	if err != nil {
    42  		app.Notify(modes.ErrorText(err))
    43  	}
    44  }