# file : libbutl/manifest-serializer.bash.in # license : MIT; see accompanying LICENSE file if [ "$butl_manifest_serializer" ]; then return 0 else butl_manifest_serializer=true fi @import libbutl.bash/utility@ # Serialize the manifest reading the binary representation from stdin and # writing to stdout. Unless --long-lines is specified, break lines in values. # # Normally you would use the start/finish functions below. # function butl_serialize_manifest () # [--long-lines] { "$(butl_path)/manifest" "$@" serialize } # Start the manifest serialization co-process setting the following "return" # variables: # # butl_manifest_serializer_ifd # butl_manifest_serializer_ofd # butl_manifest_serializer_pid # # If is not specified, then write to stdout. Unless --long-lines is # specified, break lines in values. # # The typical usage: # # butl_manifest_serializer_start # # fd="$butl_manifest_serializer_ifd" # # printf ":1\0" >&"$fd" # printf "name:foo\0" >&"$fd" # printf "version:1.2.3\0" >&"$fd" # # butl_manifest_serializer_finish # function butl_manifest_serializer_start () # [--long-lines] [] { local ops=() while [ $# -gt 0 ]; do case "$1" in --long-lines) ops+=("$1") shift ;; *) break ;; esac done if [ "$#" -gt 0 ]; then exec {butl_manifest_serializer_ofd}>"$1" else exec {butl_manifest_serializer_ofd}>&1 fi # See notes in butl_manifest_parser_start() on bash co-process issues. # coproc { kill -SIGSTOP $BASHPID; \ exec "$(butl_path)/manifest" "${ops[@]}" serialize; } \ >&"$butl_manifest_serializer_ofd" butl_manifest_serializer_ifd="${COPROC[1]}" butl_manifest_serializer_pid="$COPROC_PID" butl_resume_process "$butl_manifest_serializer_pid" } # Finish the manifest serialization co-process. # function butl_manifest_serializer_finish () { exec {butl_manifest_serializer_ifd}<&- wait "$butl_manifest_serializer_pid" exec {butl_manifest_serializer_ofd}<&- }