diff --git a/syndicate.sh b/syndicate.sh index 0e4109f..c832ba5 100755 --- a/syndicate.sh +++ b/syndicate.sh @@ -11,19 +11,37 @@ declare -A ds_retraction_handlers ds_project() { # cargo install preserves-tools - echo "$1" | preserves-tool convert --indent=no --select "$2" + local input="$1" + local selector="$2" + shift 2 + echo "$input" | preserves-tool convert --indent=no --select "$selector" "$@" +} + +ds_connect_stdio() { + eval "$1" + exec 5<&0 6>&1 + ds_flush + ds_mainloop } ds_connect() { + local addr=$1 + case $(ds_project "$addr" ".^") in + tcp) nc_args="$(ds_project "$addr" ". 0" --output-format=unquoted) $(ds_project "$addr" ". 1")";; + unix) nc_args="-U $(ds_project "$addr" ". 0" --output-format=unquoted)";; + stdio) ds_connect_stdio "$2"; return;; + *) echo "ds_connect: address '$addr' not supported"; return 1;; + esac + local f=$(mktemp -u /tmp/ds.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX) mkfifo $f trap "rm -f $f" 2 EXIT RETURN { - eval "$1" + eval "$2" ds_flush ds_mainloop - } 5< <(nc -U ./sock <$f) 6>$f + } 5< <(nc $nc_args <$f) 6>$f } ds_send() { @@ -139,7 +157,9 @@ demo() { fi } ds_object bootk demo_ds_resolved - ds_connect 'ds_assert "#![1 0]" " $bootk>"' + ds_connect \ + '' \ + 'ds_assert "#![1 0]" " $bootk>"' } demo