set -euo pipefail
ROOT_DIR=${0:A:h:h}
SLICK_BIN=${SLICK_PREVIEW_BIN:-$ROOT_DIR/target/debug/slick}
SLICK_PREVIEW_BRANCH=${SLICK_PREVIEW_BRANCH:-develop}
SLICK_PREVIEW_STATUS=${SLICK_PREVIEW_STATUS:-M 10}
SLICK_PREVIEW_ELAPSED=${SLICK_PREVIEW_ELAPSED:-0}
SLICK_PREVIEW_INTERVAL=${SLICK_PREVIEW_INTERVAL:-1}
SLICK_PREVIEW_TOOLBOX_NAME=${SLICK_PREVIEW_TOOLBOX_NAME:-codex}
SLICK_PREVIEW_DEVPOD_NAME=${SLICK_PREVIEW_DEVPOD_NAME:-hfile}
SLICK_PREVIEW_PYTHON_ENV=${SLICK_PREVIEW_PYTHON_ENV:-venv}
PROMPT_DATA=$(printf '{"action":"","auth_failed":false,"branch":"%s","remote":[],"staged":false,"status":"%s","u_name":""}' \
"$SLICK_PREVIEW_BRANCH" "$SLICK_PREVIEW_STATUS")
TOOLBOX_TMP=''
cleanup() {
if [[ -n ${TOOLBOX_TMP} && -d ${TOOLBOX_TMP} ]]; then
rm -rf -- "$TOOLBOX_TMP"
fi
}
trap cleanup EXIT
usage() {
cat <<'USAGE'
Usage: zsh scripts/preview_prompt.zsh [--watch]
Renders prompt previews for the common context markers using the current
SLICK_PROMPT_* environment variables plus simulated Toolbx, DevPod, and Python
contexts.
Optional environment overrides:
SLICK_PREVIEW_BRANCH=main
SLICK_PREVIEW_STATUS="M 2"
SLICK_PREVIEW_TOOLBOX_NAME=toolbox
SLICK_PREVIEW_DEVPOD_NAME=workspace
SLICK_PREVIEW_PYTHON_ENV=.venv
SLICK_PREVIEW_INTERVAL=2
USAGE
}
ensure_binary() {
if [[ -x $SLICK_BIN ]]; then
return
fi
cargo build --quiet --manifest-path "$ROOT_DIR/Cargo.toml"
}
setup_toolbox_fixture() {
TOOLBOX_TMP=$(mktemp -d)
: > "$TOOLBOX_TMP/.toolboxenv"
printf 'engine="podman"\nname="%s"\nid="preview"\n' "$SLICK_PREVIEW_TOOLBOX_NAME" > "$TOOLBOX_TMP/.containerenv"
}
render_prompt() {
local -a env_args
env_args=(
env
-u DEVPOD
-u DEVPOD_WORKSPACE_ID
-u VIRTUAL_ENV
-u VIRTUAL_ENV_PROMPT
-u PYENV_VERSION
-u PIPENV_ACTIVE
-u PIPENV_ACTIVE_COLOR
-u SLICK_TEST_TOOLBOXENV_PATH
-u SLICK_TEST_CONTAINERENV_PATH
"$@"
"$SLICK_BIN"
prompt
-e "$SLICK_PREVIEW_ELAPSED"
-r 0
-k main
-d "$PROMPT_DATA"
)
"${env_args[@]}"
}
show_example() {
local title=$1
shift
local rendered
print -P -- "%B${title}%b"
rendered=$(render_prompt "$@")
print -P -- "$rendered"
print
}
show_examples() {
print -P -- "%BPrompt Preview%b"
print
show_example "Base"
show_example "Toolbx" \
SLICK_TEST_TOOLBOXENV_PATH="$TOOLBOX_TMP/.toolboxenv" \
SLICK_TEST_CONTAINERENV_PATH="$TOOLBOX_TMP/.containerenv"
show_example "DevPod" \
DEVPOD=true \
DEVPOD_WORKSPACE_ID="$SLICK_PREVIEW_DEVPOD_NAME"
show_example "Toolbx + Python" \
SLICK_TEST_TOOLBOXENV_PATH="$TOOLBOX_TMP/.toolboxenv" \
SLICK_TEST_CONTAINERENV_PATH="$TOOLBOX_TMP/.containerenv" \
VIRTUAL_ENV="/tmp/venvs/$SLICK_PREVIEW_PYTHON_ENV"
show_example "DevPod + Python" \
DEVPOD=true \
DEVPOD_WORKSPACE_ID="$SLICK_PREVIEW_DEVPOD_NAME" \
VIRTUAL_ENV="/tmp/venvs/$SLICK_PREVIEW_PYTHON_ENV"
}
main() {
local mode=${1:-once}
case "$mode" in
once)
;;
--watch)
;;
-h|--help)
usage
return 0
;;
*)
usage >&2
return 1
;;
esac
cd "$ROOT_DIR"
ensure_binary
setup_toolbox_fixture
if [[ "$mode" == --watch ]]; then
while true; do
clear
show_examples
print -r -- "Refreshing every ${SLICK_PREVIEW_INTERVAL}s. Press Ctrl-C to exit."
sleep "$SLICK_PREVIEW_INTERVAL"
done
else
show_examples
fi
}
main "$@"