\name{getargs}
\alias{getargs}
\title{
Get script arguments
}
\description{
Get script arguments given a list object specifying arguments and documentation.  Can be used in command-line or interactive mode.  This is helpful when developing scripts in interactive mode that will eventually become command-line programs.  If no arguments are specified or help is requested in command-line mode, the script will print out a usage statement with available arguments and exit.
}
\usage{
getargs(argspec, doc = NA)
}
\arguments{
  \item{argspec}{
A list object.  Each key is an argument name.  The value is another list object with a 'value' and 'doc' keys.  For example:
\preformatted{argspec = list(
    arg1 = list(value=10, doc="Info for optional arg1"),
    arg2 = list(value=NA, doc="Info for required arg2")
);
}

If the value provided is NA, the argument is considered required and must be specified when the script is invoked.  For command-line mode, this means the argument must be specified on the command-line.  In interactive mode, there are two ways of specifying these arguments.  First, if a properly formatted list argument called 'cmdargs' is present in the current environment (i.e. the object returned by getargs() from a previous invocation), the value is taken from this object.  Otherwise, the argument is prompted for.
}

  \item{doc}{
An optional string succinctly documenting the purpose of the script.
}
}
\details{
Interactive scripts typically make use of hardcoded filepaths and parameter settings.  This makes testing easy, but generalization to non-interactive mode more difficult.  This utility provides a mechanism for writing scripts that work properly in both interactive and command-line modes.

To use this method, specify a list with key-value pairs representing the arguments as specified above.  In command-line mode, if no arguments are specified or the user specifies '-h' or '-help' anywhere on the command string, a help message indicating available arguments, their default values, and some documentation about the argument are provided.
}
\value{
Returns a list with keys matching the argspec and values representing the specified arguments.

\item{arg1 }{Value for argument 1}
\item{arg2 }{Value for argument 2}
...etc.
}
\references{
%% ~put references to the literature/web site here ~
}
\author{
Kiran Garimella
}
\examples{
argspec = list(
    file    = list(value="/my/test.vcf", doc="VCF file"),
    verbose = list(value=0,              doc="If 1, set verbose mode"),
    test2   = list(value=2.3e9,          doc="Another argument that does stuff")
);
        
cmdargs = getargs(argspec, doc="My test program");

print(cmdargs$file);  # will print '[1] "/my/test.vcf"'
}
\keyword{ ~kwd1 }
