#!/bin/bash
# This file is meant to be SOURCED
#
#   Copyright 2016 RIFT.IO Inc
#
#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.
#
# container_funcs
# 24 June 2016 -- Jeremy Mordkoff -- Genesis

print_stack() {
   local i
   local stack_size=${#FUNCNAME[1]}
   echo  "BACKTRACE:" >&2
   for (( i=1; i<$stack_size ; i++ )); do
      local func="${FUNCNAME[$i]}"
      [ x$func = x ] && func=MAIN
      local linen="${BASH_LINENO[(( i - 1 ))]}"
      local src="${BASH_SOURCE[$i]}"
      [ x"$src" = x ] && src=non_file_source
      echo "### $func $src $linen" >&2
   done
   echo "-------" >&2
}


FATAL_TRACK() {
	echo -e "\n### $(date) ${FUNCNAME[1]}: FATAL error: $*" >&2
	track end fatal $1 "'${@:2}'" none
	print_stack
	exit 1
}

FATAL() { 
	echo -e "\n### $(date) ${FUNCNAME[1]}: FATAL error: $*" >&2
	print_stack
	exit 1
}
	
WARNING() { 
	echo -e "\n### $(date) ${FUNCNAME[1]}: WARNING error: $*" >&2
}

INFO() { 
	echo "##  $(date) ${FUNCNAME[1]}: INFO: $*" >&2
}

DEBUG() { 
	echo "#   $(date) ${FUNCNAME[1]}: DEBUG: $*" >&2
}

CMD() {
	echo "# executing '$*' ..."
	"$@"
	rc=$?
	echo "# .... '$*' done RC was $rc"
	return $rc
}
