github.com/elves/elvish@v0.15.0/pkg/eval/mods/daemon/daemon.go (about)

     1  // Package daemon implements the builtin daemon: module.
     2  package daemon
     3  
     4  import (
     5  	"errors"
     6  	"strconv"
     7  
     8  	"github.com/elves/elvish/pkg/daemon"
     9  	"github.com/elves/elvish/pkg/eval"
    10  	"github.com/elves/elvish/pkg/eval/vars"
    11  )
    12  
    13  // errDontKnowHowToSpawnDaemon is thrown by daemon:spawn when the Evaler's
    14  // DaemonSpawner field is nil.
    15  var errDontKnowHowToSpawnDaemon = errors.New("don't know how to spawn daemon")
    16  
    17  // Ns makes the daemon: namespace.
    18  func Ns(d daemon.Client, spawnCfg *daemon.SpawnConfig) *eval.Ns {
    19  	getPid := func() (string, error) {
    20  		pid, err := d.Pid()
    21  		return string(strconv.Itoa(pid)), err
    22  	}
    23  
    24  	spawn := func() error {
    25  		if spawnCfg == nil {
    26  			return errDontKnowHowToSpawnDaemon
    27  		}
    28  		return daemon.Spawn(spawnCfg)
    29  	}
    30  
    31  	// TODO: Deprecate the variable in favor of the function.
    32  	getPidVar := func() interface{} {
    33  		pid, err := getPid()
    34  		if err != nil {
    35  			return "-1"
    36  		}
    37  		return pid
    38  	}
    39  
    40  	return eval.NsBuilder{
    41  		"pid":  vars.FromGet(getPidVar),
    42  		"sock": vars.NewReadOnly(string(d.SockPath())),
    43  	}.AddGoFns("daemon:", map[string]interface{}{
    44  		"pid":   getPid,
    45  		"spawn": spawn,
    46  	}).Ns()
    47  }