dx/dxkit/core/command.sh

29 lines
950 B
Bash

#!/usr/bin/env bash
declare -A _LOADED_COMMANDS=() # Unused for now
readonly _COMMAND_NAMESPACE="cmd"
readonly _COMMAND_AUTO_LOAD_HOOK="on_load"
function command::namespace { echo "${_COMMAND_NAMESPACE}"; }
function command::fn { echo "$(command::namespace)::$(command::to_namespace "$1")::${2}"; }
function command::loaded() { [[ -n "${_LOADED_COMMANDS["$1"]:-}" ]]; }
function command::has_function() { declare -F "$(command::fn "$1" "$2")" >/dev/null 2>&1; }
function command::is_auto_load() { declare -F "$(command::fn "$1" on_load)" >/dev/null 2>&1; }
function command::to_namespace() { echo "${1//\//::}"; }
function command::exists() { command::has_function "$1" run; }
function command::run() {
local cmd="$1"
shift
hook::run "$cmd" pre
core::call_function "$(command::fn "$cmd" run)" "$@"
local exit_code=$?
if [[ $exit_code -eq 0 ]]; then
hook::run "$cmd" post
fi
return $exit_code
}