| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 | <?phpnamespace MrClay\Cli;use BadMethodCallException;/** * An argument for a CLI app. This specifies the argument, what values it expects and * how it's treated during validation. * * By default, the argument will be assumed to be an optional letter flag with no value following. * * If the argument may receive a value, call mayHaveValue(). If there's whitespace after the * flag, the value will be returned as true instead of the string. * * If the argument MUST be accompanied by a value, call mustHaveValue(). In this case, whitespace * is permitted between the flag and its value. * * Use assertFile() or assertDir() to indicate that the argument must return a string value * specifying a file or directory. During validation, the value will be resolved to a * full file/dir path (not necessarily existing!) and the original value will be accessible * via a "*.raw" key. E.g. $cli->values['f.raw'] * * Use assertReadable()/assertWritable() to cause the validator to test the file/dir for * read/write permissions respectively. * * @method \MrClay\Cli\Arg mayHaveValue() Assert that the argument, if present, may receive a string value * @method \MrClay\Cli\Arg mustHaveValue() Assert that the argument, if present, must receive a string value * @method \MrClay\Cli\Arg assertFile() Assert that the argument's value must specify a file * @method \MrClay\Cli\Arg assertDir() Assert that the argument's value must specify a directory * @method \MrClay\Cli\Arg assertReadable() Assert that the specified file/dir must be readable * @method \MrClay\Cli\Arg assertWritable() Assert that the specified file/dir must be writable * * @property-read bool mayHaveValue * @property-read bool mustHaveValue * @property-read bool assertFile * @property-read bool assertDir * @property-read bool assertReadable * @property-read bool assertWritable * @property-read bool useAsInfile * @property-read bool useAsOutfile * * @author Steve Clay <steve@mrclay.org> * @license http://www.opensource.org/licenses/mit-license.php  MIT License */class Arg {    /**     * @return array     */    public function getDefaultSpec()    {        return array(            'mayHaveValue' => false,            'mustHaveValue' => false,            'assertFile' => false,            'assertDir' => false,            'assertReadable' => false,            'assertWritable' => false,            'useAsInfile' => false,            'useAsOutfile' => false,        );    }    /**     * @var array     */    protected $spec = array();    /**     * @var bool     */    protected $required = false;    /**     * @var string     */    protected $description = '';    /**     * @param bool $isRequired     */    public function __construct($isRequired = false)    {        $this->spec = $this->getDefaultSpec();        $this->required = (bool) $isRequired;        if ($isRequired) {            $this->spec['mustHaveValue'] = true;        }    }    /**     * Assert that the argument's value points to a writable file. When     * Cli::openOutput() is called, a write pointer to this file will     * be provided.     * @return Arg     */    public function useAsOutfile()    {        $this->spec['useAsOutfile'] = true;        return $this->assertFile()->assertWritable();    }    /**     * Assert that the argument's value points to a readable file. When     * Cli::openInput() is called, a read pointer to this file will     * be provided.     * @return Arg     */    public function useAsInfile()    {        $this->spec['useAsInfile'] = true;        return $this->assertFile()->assertReadable();    }    /**     * @return array     */    public function getSpec()    {        return $this->spec;    }    /**     * @param string $desc     * @return Arg     */    public function setDescription($desc)    {        $this->description = $desc;        return $this;    }    /**     * @return string     */    public function getDescription()    {        return $this->description;    }    /**     * @return bool     */    public function isRequired()    {        return $this->required;    }    /**     * Note: magic methods declared in class PHPDOC     *     * @param string $name     * @param array $args     * @return Arg     * @throws BadMethodCallException     */    public function __call($name, array $args = array())    {        if (array_key_exists($name, $this->spec)) {            $this->spec[$name] = true;            if ($name === 'assertFile' || $name === 'assertDir') {                $this->spec['mustHaveValue'] = true;            }        } else {            throw new BadMethodCallException('Method does not exist');        }        return $this;    }    /**     * Note: magic properties declared in class PHPDOC     *     * @param string $name     * @return bool|null     */    public function __get($name)    {        if (array_key_exists($name, $this->spec)) {            return $this->spec[$name];        }        return null;    }}
 |