wiki-grav/plugins/flex-objects/cli/FlexConvertDataCommand.php
2022-04-24 14:32:58 +02:00

142 lines
3.8 KiB
PHP

<?php
namespace Grav\Plugin\Console;
use Exception;
use Grav\Common\Utils;
use Grav\Common\Yaml;
use Grav\Console\ConsoleCommand;
use Symfony\Component\Console\Input\InputOption;
use function count;
/**
* Class FlushQueueCommand
* @package Grav\Console\Cli\
*/
class FlexConvertDataCommand extends ConsoleCommand
{
/** @var array */
protected $options = [];
/**
* @return void
*/
protected function configure(): void
{
$this
->setName('convert-data')
->setAliases(['convertdata'])
->addOption(
'in',
'i',
InputOption::VALUE_REQUIRED,
'path to file to convert from (valid types: [json|yaml])'
)
->addOption(
'out',
'o',
InputOption::VALUE_REQUIRED,
'format of file to convert to [json|yaml]'
)
->setDescription('Converts data from one format to another')
->setHelp('The <info>clear-queue-failures</info> command clears any queue failures that have accumulated');
}
/**
* @return int
*/
protected function serve(): int
{
$input = $this->getInput();
$io = $this->getIO();
$out_raw = null;
$in = $input->getOption('in');
$in_parts = Utils::pathinfo($in);
$in_extension = $in_parts['extension'];
$out_extension = $input->getOption('out');
$io->title('Flex Convert Data');
if (!file_exists($in)) {
$io->error('cannot find the file: ' . realpath($in));
return 1;
}
if (!$in_extension) {
$io->error($in . ' has no file extension defined');
return 1;
}
if (!$out_extension) {
$io->error($out_extension . ' is not a valid extension');
return 1;
}
$in_raw = file_get_contents($in);
// Get the input data
if ($in_extension === 'yaml' || $in_extension === 'yml') {
$in_data = Yaml::parse($in_raw);
} elseif ($in_extension === 'json' ) {
$in_data = json_decode($in_raw, true, 512, JSON_THROW_ON_ERROR);
} else {
$io->error('input files with extension ' . $in_extension . ', is not supported');
return 1;
}
// Simple progress bar
$progress = $io->createProgressBar(count($in_data));
$progress->setFormat('verbose');
$progress->start();
// add Unique Id if needed
$index = 0;
$out_data = [];
foreach ($in_data as $key => $entry) {
if ($key === $index++) {
$out_data[$this->generateKey()] = $entry;
} else {
$out_data[$key] = $entry;
}
$progress->advance();
}
// render progress
$progress->finish();
$io->newLine(2);
// Convert to output format
if ($out_extension === 'yaml' || $out_extension === 'yml') {
$out_raw = Yaml::dump($out_data);
} elseif ($out_extension === 'json' ) {
$out_raw = json_encode($out_data, JSON_PRETTY_PRINT);
} else {
$io->error('input files with extension ' . $out_extension . ', is not supported');
return 1;
}
// Write the file:
$out_filename = $in_parts['dirname'] . '/' . $in_parts['filename'] . '.' . $out_extension;
file_put_contents($out_filename, $out_raw);
$io->success('successfully converted the file and saved as: ' . $out_filename);
return 0;
}
/**
* @return string|false
* @throws Exception
*/
protected function generateKey()
{
return substr(hash('sha256', random_bytes(32)), 0, 32);
}
}