dolang-shell-modules 0.1.0

Stock embedded Do modules for the shell.
import _vfs
import
  shell:
    - Vfs
  _container.common:
    - runtime_dir
  proc.run:
    - toolbox
  strand:
    - pipeline
  fs

def run_command
  :name = nil
  cd: cd_override = nil
  env: env_override = nil
  ...args
do
  toolbox run
    if (name != nil)
      --container $name
    -- env -C
    if (cd_override != nil)
      $cd_override
    else
      $cd()
    for k v = (env_override || {})
      if (v == nil)
        -u (str k)
      else
        $(str k)=$v
    ...args

def run_agent
  thunk
  :name = nil
  cd: cd_override = nil
  env: env_override = nil
do
  let socket = "$(runtime_dir())/toolbox-vfs-$name"
  let agent = _vfs.bin()
  let input = strand.input()
  pipeline
    do run_command
      - $agent
      - $socket
      :name
      cd: $cd_override
      env: (env_override || {})
    do
      strand.next()
      let agent = Vfs.unix_socket $socket
      try
        return strand.redirect input: $input do agent $thunk
      finally
        fs.remove $socket

pub def run
  cmd
  :name = nil
  cd: cd_override = nil
  env: env_override = nil
  ...args
do
  run_command
    :name
    cd: $cd_override
    env: $env_override
    $cmd ...args.pos_only()

# Run a callable inside a toolbox container.
#
# The block sees the toolbox filesystem and process environment.
pub def with
  thunk
  :name = nil
  cd: cd_override = nil
  env: env_override = nil
do
  run_agent
    $thunk
    :name
    cd: $cd_override
    env: $env_override