141 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
		
		
			
		
	
	
			141 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
|   | <?php | ||
|  | 
 | ||
|  | namespace Grav\Plugin\Console; | ||
|  | 
 | ||
|  | use Exception; | ||
|  | 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 = 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); | ||
|  |     } | ||
|  | } |