. "$HOME/.ad/lib/ad.sh"
CARGO_FORMAT="short"
WATCH_TESTS="WatchTests"
STOP_TESTS="StopTests"
TEST_BUTTON="$WATCH_TESTS"
ARGS=""
header() {
[[ -z "$ARGS" ]] || s=" args='$ARGS'"
echo -e "(Clear) (SetCargoFormat) ($TEST_BUTTON$s)\n"
}
clearOutput() { adEdit "x/\n>>>@*/ c/\n>>>/"; }
updateTestOutput() {
clearOutput
cargo test "$ARGS" | bufWrite "$1" body
}
updateCargoOutput() {
clearBuffer "$1"
header | bufWrite "$1" body
cargo clippy --all-targets --workspace --message-format="$CARGO_FORMAT" 2>&1 | bufWrite "$1" body
echo -en "\n\n>>>" | bufWrite "$1" body
content="$(bufRead "$1" body)"
if [[ "$content" =~ error|warning ]]; then
focusBuffer "$1"
adEdit 'x/(.+):(\d+):(\d+):/ c/$1:$2:$3/'
elif [[ "$TEST_BUTTON" = "$STOP_TESTS" ]]; then
updateTestOutput "$1"
fi
curToBof "$1"
markClean "$1"
}
handleEvents() {
bufRead "$1" event | while read -r line; do
kind="$(echo "$line" | jq -r '.kind')"
target="$(echo "$line" | jq -r '.txt')"
case "$kind" in
"L")
if [[ "$target" =~ E.... ]]; then
output="$(cargo --explain "$target")"
curToBof "$1"
adEdit "x/\n>>>@*/ d"
echo -en "\n>>> Explanation for error[$target] (Clear)\n$output" | bufWrite "$1" body
markClean "$1"
else
echo -n "$line" | bufWrite "$1" event
fi
;;
"X")
if [[ "$target" = "SetCargoFormat" ]]; then
raw="$(echo -en "human\nshort" | minibufferSelect "output format> ")"
if [[ "$raw" =~ human|short ]]; then
CARGO_FORMAT="$raw"
updateCargoOutput "$1"
fi
elif [[ "$target" = "$WATCH_TESTS" ]]; then
ARGS="$(echo -n "$ARGS" | minibufferSelect "args> ")"
TEST_BUTTON="$STOP_TESTS"
updateCargoOutput "$1"
elif [[ "$target" = "$STOP_TESTS" ]]; then
TEST_BUTTON="$WATCH_TESTS"
ARGS=""
updateCargoOutput "$1"
elif [[ "$target" = "Clear" ]]; then
clearOutput
markClean "$1"
else
echo -n "$line" | bufWrite "$1" event
fi
;;
esac
done
}
currentId="$(currentBufferId)"
root="$(git rev-parse --show-toplevel)"
adCtl "open-in-new-window $root/+cargo"
id="$(adIndex | grep "+cargo" | cut -f1)"
focusBuffer "$currentId"
updateCargoOutput "$id"
handleEvents "$id" &
adLog | while read -r line; do
action="$(echo "$line" | cut -d' ' -f2)"
if [ "$action" = "save" ]; then
updateCargoOutput "$id"
fi
done