2019-05-20 15:08:41 +10:00
< ? php
declare ( strict_types = 1 );
include __DIR__ . '/../vendor/autoload.php' ;
use pointybeard\Helpers\Cli\Input ;
2019-05-20 22:39:08 +10:00
use pointybeard\Helpers\Cli\Colour\Colour ;
use pointybeard\Helpers\Functions\Cli ;
2019-05-20 15:08:41 +10:00
// Define what we are expecting to get from the command line
$collection = ( new Input\InputCollection ())
2019-05-24 17:20:50 +10:00
-> append (
Input\InputTypeFactory :: build ( 'Argument' )
-> name ( 'action' )
-> flags ( Input\AbstractInputType :: FLAG_REQUIRED )
-> description ( 'The name of the action to perform' )
)
-> append (
Input\InputTypeFactory :: build ( 'IncrementingFlag' )
-> name ( 'v' )
-> flags ( Input\AbstractInputType :: FLAG_OPTIONAL | Input\AbstractInputType :: FLAG_TYPE_INCREMENTING )
-> description ( 'verbosity level. -v (errors only), -vv (warnings and errors), -vvv (everything).' )
-> validator ( new Input\Validator (
function ( Input\AbstractInputType $input , Input\AbstractInputHandler $context ) {
// Make sure verbosity level never goes above 3
return min ( 3 , ( int ) $context -> find ( 'v' ));
}
))
)
-> append (
Input\InputTypeFactory :: build ( 'LongOption' )
-> name ( 'data' )
-> short ( 'd' )
-> flags ( Input\AbstractInputType :: FLAG_OPTIONAL | Input\AbstractInputType :: FLAG_VALUE_REQUIRED )
-> description ( 'Path to the input JSON data' )
-> validator ( new Input\Validator (
function ( Input\AbstractInputType $input , Input\AbstractInputHandler $context ) {
// Make sure -d (--data) is a valid file that can be read
$file = $context -> find ( 'data' );
if ( ! is_readable ( $file )) {
throw new \Exception ( 'The file specified via option --data does not exist or is not readable.' );
}
// Now make sure it is valid JSON
try {
$json = json_decode ( file_get_contents ( $file ), false , 512 , JSON_THROW_ON_ERROR );
} catch ( JsonException $ex ) {
throw new \Exception ( sprintf ( 'The file specified via option --data does not appear to be a valid JSON ddocument. Returned: %s: %s' , $ex -> getCode (), $ex -> getMessage ()));
}
return $json ;
}
))
)
2019-05-20 15:08:41 +10:00
;
// Get the supplied input. Passing the collection will make the handler bind values
// and validate the input according to our collection
2019-05-24 17:20:50 +10:00
try {
$argv = Input\InputHandlerFactory :: build ( 'Argv' , $collection );
} catch ( \Exception $ex ) {
echo " Error when attempting to bind values to collection. Returned: " . $ex -> getMessage () . PHP_EOL ;
exit ;
}
2019-05-20 15:08:41 +10:00
// Display the manual in green text
2019-05-24 13:28:34 +10:00
echo Cli\manpage (
2019-05-20 22:39:08 +10:00
basename ( __FILE__ ),
2019-05-24 13:28:34 +10:00
'1.0.2' ,
2019-05-20 22:39:08 +10:00
'An example script for the PHP Helpers: Command-line Input and Input Type Handlers composer library (pointybeard/helpers-cli-input).' ,
2019-05-24 13:28:34 +10:00
$collection ,
Colour :: FG_GREEN ,
Colour :: FG_WHITE ,
[
'Examples' => 'php -f example/example.php -- -vvv -d example/example.json import'
]
) . PHP_EOL . PHP_EOL ;
2019-05-20 22:39:08 +10:00
2019-05-24 13:28:34 +10:00
// example.php 1.0.2, An example script for the PHP Helpers: Command-line Input
// and Input Type Handlers composer library (pointybeard/helpers-cli-input).
2019-05-20 22:39:08 +10:00
// Usage: example.php [OPTIONS]... ACTION...
//
// Arguments:
2019-05-24 13:28:34 +10:00
// ACTION The name of the action to perform
2019-05-20 22:39:08 +10:00
//
// Options:
2019-05-24 13:28:34 +10:00
// -v verbosity level. -v (errors only), -vv
// (warnings and errors), -vvv (everything).
// -d, --data=VALUE Path to the input JSON data
2019-05-20 22:39:08 +10:00
//
// Examples:
2019-05-24 17:20:50 +10:00
// php -f example/example.php -- -vvvs -d example/example.json import
try {
var_dump ( $argv -> find ( 'action' ));
// string(6) "import"
var_dump ( $argv -> find ( 'v' ));
//int(3)
var_dump ( $argv -> find ( 's' ));
//bool(true)
var_dump ( $argv -> find ( 'data' ));
// class stdClass#11 (1) {
// public $fruit =>
// array(2) {
// [0] =>
// string(5) "apple"
// [1] =>
// string(6) "banana"
// }
// }
var_dump ( $argv -> find ( 'nope-doesnt-exist' ));
} catch ( \Exception $ex ) {
echo " Error: " . $ex -> getMessage () . PHP_EOL ;
}
//Error trying to access input. Returned: Input nope-doesnt-exist could not be found.