#!/usr/bin/env bash

# Use bash's pipefail option to get errors during failure in a command
# pipeline.  This is useful to get notified about an error from dbus-send
# when used with "|tail".
set -o pipefail

if [ -t 0 ]  # is a tty.
then
    # rlwrap provides readline functionality for "read", which is more enhanced
    # than bash's "read" itself.
    # It can be disabled/overridden using 'AWESOME_RLWRAP= awesome-client'.
    if [ -z "${AWESOME_RLWRAP+x}" ]; then
        AWESOME_RLWRAP="$(which rlwrap 2>/dev/null)"
    fi
    if [ -n "$AWESOME_RLWRAP" ]
    then
        if [ "$A_RERUN" = "" ]
        then
            A_RERUN="no" exec "$AWESOME_RLWRAP" "$0" "$@"
        fi
        READ_ARGS=""
    else
        # No rlwrap: use bash's readline.
        READ_ARGS="-e"
    fi
fi

DBUS_SEND=dbus-send

which ${DBUS_SEND} > /dev/null
if test $? = 1
then
    echo "E: Unable to find" ${DBUS_SEND}
    exit 1
fi

DBUS_PATH=/
DBUS_DEST=org.awesomewm.awful
DBUS_METHOD=${DBUS_DEST}.Remote.Eval

FATAL_ERRORS=1
a_dbus_send()
{
    $DBUS_SEND --dest=$DBUS_DEST --type=method_call --print-reply \
        $DBUS_PATH $DBUS_METHOD string:"$1" | tail -n +2
    ret=$?
    if [ "$ret" != 0 ] && [ "$FATAL_ERRORS" != 0 ]; then
        echo "E: $DBUS_SEND failed." >&2
        exit $ret
    fi
}

print_help()
{
    echo "Usage: awesome-client [-h|--help] [command [command...]]
awesome window manager remote execution

awesome-client is a remote command line interface to awesome.
It communicates with awesome via D-Bus, allowing remote execution of Lua code.

Run without a command to enter REPL (read-eval-print-loop) mode.
For examples see \`man awesome-client\`."
}

if [ $# -ne 0 ]
then
    # check for command-line arguments
    ARGS=()
    for arg in "$@"; do
        if [ "$arg" = "-h" ] || [ "$arg" = "--help" ]; then
            print_help
            exit 0
        else
            ARGS+=("$arg")
        fi
    done
    # run arguments
    for arg in "${ARGS[@]}"; do
        a_dbus_send "$arg"
    done
elif [ -t 0 ]
then
    FATAL_ERRORS=0
    while read $READ_ARGS -p "awesome# " -r line
    do
        if [ "$line" = "" ]; then
            continue
        fi
        a_dbus_send "$line"
    done
else
    a_dbus_send "$(cat)"
fi

# vim: filetype=sh:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80
