#!/bin/bash
# Composure - don't fear the UNIX chainsaw...
# by erichs, 2012

# these are a set of light-hearted shell functions that aim to make
# programming the shell easier and more intuitive

# latest source available at http://git.io/composure

source_composure ()
{
    if [ -z "$EDITOR" ]
    then
      export EDITOR=vi
    fi

    if $(tty -s)    # is this a TTY?
    then
      bind '"\C-j": edit-and-execute-command'
    fi

    cite ()
    {
        about () { :; }
        about creates a new meta keyword for use in your functions
        local keyword=$1
        for keyword in $*; do
            eval "function $keyword { :; }"
        done
    }

    cite about param example

    draft ()
    {
      about wraps last command into a new function
      param 1: name to give function
      example $ ls
      example $ draft list
      example $ list
      local name=$1
      eval 'function ' $name ' { ' $(fc -ln -1) '; }'
    }

    write ()
    {
      about prints function declaration to stdout
      param name of function or functions, separated by spaces
      example $ write myfunction
      example $ write func1 func2 func3 > ~/funcs.sh
      local func
      for func in $*
      do
          # trim trailing semicolons generated by declare -f
          declare -f $func | sed  "s/^\(.*\);$/\1/"
          echo
      done
    }

    revise ()
    {
        about loads function into editor for revision
        param name of function or functions, separated by spaces
        example $ revise myfunction
        example $ revise func1 func2 func3
        local temp=$(mktemp /tmp/revise.XXXX)
        write $* > $temp
        $EDITOR $temp
        eval "$(cat $temp)"
        rm $temp
    }

    metafor ()
    {
        about prints function metadata associated with keyword
        param 1: function name
        param 2: meta keyword
        example $ metafor reference example
        local func=$1 keyword=$2
        write $func | sed -n "s/^ *$keyword \([^([].*\)$/\1/p"
    }

    reference ()
    {
        about displays help summary for all functions, or help for specific function
        param 1: optional, function name
        example $ reference
        example $ reference metafor

        printline ()
        {
            local metadata=$1 lhs=${2:- }

            if [[ -z "$metadata" ]]
            then
                return
            fi

            OLD=$IFS; IFS=$'\n'
            local line
            for line in $metadata
            do
                printf "%-20s%s\n" $lhs $line
            done
            IFS=$OLD
        }

        help ()
        {
            local func=$1

            local about="$(metafor $func about)"
            printline "$about" $func

            local params="$(metafor $func param)"
            if [[ -n "$params" ]]
            then
                echo "parameters:"
                printline "$params"
            fi

            local examples="$(metafor $func example)"
            if [[ -n "$examples" ]]
            then
                echo "examples:"
                printline "$examples"
            fi

            unset printline
        }

        if [[ -n "$1" ]]
        then
            help $1
        else
            for func in $(compgen -A function); do
                local about="$(metafor $func about)"
                printline "$about" $func
            done
        fi

        unset help printline
    }

}

install_composure ()
{
    echo 'stay calm. installing composure elements...'

    # find our absolute PATH
    SOURCE="${BASH_SOURCE[0]}"
    while [ -h "$SOURCE" ]
    do
        SOURCE="$(readlink "$SOURCE")"
    done
    DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"

    # vim: automatically chmod +x scripts with #! lines
    done_previously () { [ ! -z "$(grep BufWritePost | grep bin | grep chmod)" ]; }

    if [ -f ~/.vimrc ] && ! $(<~/.vimrc done_previously)
    then
      echo 'vimrc: adding automatic chmod+x for files with shebang (#!) lines...'
      echo 'au BufWritePost * if getline(1) =~ "^#!" | if getline(1) =~ "/bin/" | silent execute "!chmod a+x <afile>" | endif | endif' >> ~/.vimrc
    fi

    # source this file in your startup: .bashrc, or .bash_profile
    local done=0
    done_previously () { [ ! -z "$(grep source | grep $DIR | grep composure)" ]; }

    [ -f ~/.bashrc ] && $(<~/.bashrc done_previously) && done=1
    ! (($done)) && [ -f ~/.bash_profile ] && $(<~/.bash_profile done_previously) && done=1

    if ! (($done))
    then
      echo 'sourcing composure from .bashrc...'
      echo "source $DIR/$(basename $0)" >> ~/.bashrc
    fi

    echo 'composure installed.'
}

if [[ "$BASH_SOURCE" == "$0" ]]
then
  install_composure
else
  source_composure
  unset install_composure source_composure
fi

: <<EOF
License: The MIT License

Copyright © 2012 Erich Smith

Permission is hereby granted, free of charge, to any person obtaining a copy of this
software and associated documentation files (the "Software"), to deal in the Software
without restriction, including without limitation the rights to use, copy, modify,
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall be included in all copies
or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
EOF
