260 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			260 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace nur\mapper\app;
 | |
| 
 | |
| use nur\A;
 | |
| use nur\b\ValueException;
 | |
| use nur\mapper\base\mappers_command;
 | |
| use nur\mapper\csv\CsvReader;
 | |
| use nur\mapper\csv\CsvReader_command;
 | |
| use nur\mapper\csv\CsvWriter;
 | |
| use nur\mapper\csv\CsvWriter_command;
 | |
| use nur\mapper\fsv\FsvReader;
 | |
| use nur\mapper\fsv\FsvReader_command;
 | |
| use nur\mapper\fsv\FsvWriter;
 | |
| use nur\mapper\fsv\FsvWriter_command;
 | |
| use nur\mapper\json\JsonReader;
 | |
| use nur\mapper\json\JsonReader_command;
 | |
| use nur\mapper\json\JsonWriter;
 | |
| use nur\mapper\json\JsonWriter_command;
 | |
| use nur\mapper\json\YamlReader;
 | |
| use nur\mapper\json\YamlReader_command;
 | |
| use nur\mapper\json\YamlWriter;
 | |
| use nur\mapper\json\YamlWriter_command;
 | |
| use nur\mapper\line\LineReader;
 | |
| use nur\mapper\line\LineReader_command;
 | |
| use nur\mapper\line\LineWriter;
 | |
| use nur\mapper\line\LineWriter_command;
 | |
| use nur\str;
 | |
| 
 | |
| class datareader_command extends mappers_command {
 | |
|   const PRODUCER_CLASSES = [
 | |
|     LineReader_command::class,
 | |
|     CsvReader_command::class,
 | |
|     FsvReader_command::class,
 | |
|     JsonReader_command::class,
 | |
|     YamlReader_command::class,
 | |
|   ];
 | |
|   const CONSUMER_CLASSES = [
 | |
|     LineWriter_command::class,
 | |
|     CsvWriter_command::class,
 | |
|     FsvWriter_command::class,
 | |
|     JsonWriter_command::class,
 | |
|     YamlWriter_command::class,
 | |
|   ];
 | |
|   const MAPPER_CLASSES = [
 | |
|   ];
 | |
| 
 | |
|   protected function DYNAMIC_COMMAND_CLASSES(): array {
 | |
|     return array_merge(
 | |
|       self::PRODUCER_CLASSES, parent::PRODUCER_CLASSES,
 | |
|       self::CONSUMER_CLASSES, parent::CONSUMER_CLASSES,
 | |
|       self::MAPPER_CLASSES, parent::MAPPER_CLASSES
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   const DEFS = [
 | |
|     "csv" => [
 | |
|       "exts" => [".csv"],
 | |
|       "formats" => ["csv", "c"],
 | |
|       "reader" => [CsvReader_command::class, CsvReader::class],
 | |
|       "writer" => [CsvWriter_command::class, CsvWriter::class],
 | |
|       "set_input_encoding" => "setEncodingFilter",
 | |
|       "set_output_encoding" => "setEncodingFilter",
 | |
|     ],
 | |
|     "fsv" => [
 | |
|       "exts" => [".fsv"],
 | |
|       "formats" => ["fsv", "v"],
 | |
|       "reader" => [FsvReader_command::class, FsvReader::class],
 | |
|       "writer" => [FsvWriter_command::class, FsvWriter::class],
 | |
|       "set_input_encoding" => "setInputEncoding",
 | |
|       "set_output_encoding" => "setOutputEncoding",
 | |
|     ],
 | |
|     "json" => [
 | |
|       "exts" => [".json"],
 | |
|       "formats" => ["json", "j"],
 | |
|       "reader" => [JsonReader_command::class, JsonReader::class],
 | |
|       "writer" => [JsonWriter_command::class, JsonWriter::class],
 | |
|       "set_input_encoding" => false,
 | |
|       "set_output_encoding" => false,
 | |
|     ],
 | |
|     "yaml" => [
 | |
|       "exts" => [".yaml", ".yml"],
 | |
|       "formats" => ["yaml", "l"],
 | |
|       "reader" => [YamlReader_command::class, YamlReader::class],
 | |
|       "writer" => [YamlWriter_command::class, YamlWriter::class],
 | |
|       "set_input_encoding" => false,
 | |
|       "set_output_encoding" => false,
 | |
|     ],
 | |
|     "line" => [
 | |
|       "exts" => [],
 | |
|       "formats" => ["line"],
 | |
|       "reader" => [LineReader_command::class, LineReader::class],
 | |
|       "writer" => [LineWriter_command::class, LineWriter::class],
 | |
|       "set_input_encoding" => "setEncodingFilter",
 | |
|       "set_output_encoding" => "setEncodingFilter",
 | |
|     ],
 | |
|   ];
 | |
| 
 | |
|   const IF_OPTION = ["-f", "--input", "args" => "file",
 | |
|     "action" => [self::class, "set_input_file"],
 | |
|   ];
 | |
|   const IFO_OPTION = ["-F", "--input-format", "args" => "value",
 | |
|     "action" => [self::class, "set_input_format"],
 | |
|   ];
 | |
|   const IE_OPTION = ["-e", "--input-encoding", "args" => "value",
 | |
|     "action" => [self::class, "set_input_encoding"],
 | |
|   ];
 | |
|   const OF_OPTION = ["-o", "--output", "args" => "file",
 | |
|     "action" => [self::class, "set_output_file"],
 | |
|   ];
 | |
|   const OFO_OPTION = ["-O", "--output-format", "args" => "value",
 | |
|     "action" => [self::class, "set_output_format"],
 | |
|   ];
 | |
|   const OE_OPTION = ["-t", "--output-encoding", "args" => "value",
 | |
|     "action" => [self::class, "set_output_encoding"],
 | |
|   ];
 | |
| 
 | |
|   private static $input_file;
 | |
| 
 | |
|   static function set_input_file($file): void {
 | |
|     self::$input_file = A::last(A::with($file));
 | |
|   }
 | |
| 
 | |
|   private static $input_format;
 | |
| 
 | |
|   static function set_input_format(string $input_format) {
 | |
|     self::$input_format = $input_format;
 | |
|   }
 | |
| 
 | |
|   private static $input_encoding;
 | |
|   
 | |
|   static function set_input_encoding(string $input_encoding) {
 | |
|     self::$input_encoding = $input_encoding;
 | |
|   }
 | |
| 
 | |
|   private static $output_file;
 | |
| 
 | |
|   static function set_output_file($file): void {
 | |
|     self::$output_file = A::last(A::with($file));
 | |
|   }
 | |
| 
 | |
|   private static $output_format;
 | |
| 
 | |
|   static function set_output_format(string $output_format) {
 | |
|     self::$output_format = $output_format;
 | |
|   }
 | |
| 
 | |
|   private static $output_encoding;
 | |
| 
 | |
|   static function set_output_encoding(string $output_encoding) {
 | |
|     self::$output_encoding = $output_encoding;
 | |
|   }
 | |
| 
 | |
|   static function get(): array {
 | |
|     $producer = null;
 | |
|     $input_file = self::$input_file;
 | |
|     $input_format = self::$input_format;
 | |
|     if ($input_file !== null || $input_format !== null) {
 | |
|       if ($input_file !== null && $input_format === null) {
 | |
|         foreach (self::DEFS as $def) {
 | |
|           foreach (A::with($def["exts"]) as $ext) {
 | |
|             if (str::_ends_with($ext, $input_file)) {
 | |
|               $input_format = A::first(A::with($def["formats"]));
 | |
|               break 2;
 | |
|             }
 | |
|           }
 | |
|         }
 | |
|         if ($input_format === null) $input_format = "line";
 | |
|       }
 | |
|       $found = false;
 | |
|       foreach (self::DEFS as $def) {
 | |
|         foreach (A::with($def["formats"]) as $format) {
 | |
|           if ($input_format == $format) {
 | |
|             $found = true;
 | |
|             $producerClass = $def["reader"][1];
 | |
|             $producer = new $producerClass($input_file);
 | |
|             $input_encoding = self::$input_encoding;
 | |
|             if ($input_encoding !== null) {
 | |
|               $setInputEncoding = $def["set_input_encoding"];
 | |
|               if ($setInputEncoding) {
 | |
|                 $producer->$setInputEncoding($input_encoding);
 | |
|               }
 | |
|             }
 | |
|             break 2;
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|       if (!$found) {
 | |
|         throw new ValueException("$input_format: format invalide");
 | |
|       }
 | |
|     }
 | |
|     if ($producer === null) {
 | |
|       foreach (self::DEFS as $def) {
 | |
|         $commandClass = $def["reader"][0];
 | |
|         $producer = $commandClass::get(false);
 | |
|         if ($producer !== null) break;
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     $consumer = null;
 | |
|     $output_file = self::$output_file;
 | |
|     $output_format = self::$output_format;
 | |
|     if ($output_file !== null || $output_format !== null) {
 | |
|       if ($output_file !== null && $output_format === null) {
 | |
|         foreach (self::DEFS as $def) {
 | |
|           foreach (A::with($def["exts"]) as $ext) {
 | |
|             if (str::_ends_with($ext, $output_file)) {
 | |
|               $output_format = A::first(A::with($def["formats"]));
 | |
|               break 2;
 | |
|             }
 | |
|           }
 | |
|         }
 | |
|         if ($output_format === null) $output_format = "line";
 | |
|       }
 | |
|       $found = false;
 | |
|       foreach (self::DEFS as $def) {
 | |
|         foreach (A::with($def["formats"]) as $format) {
 | |
|           if ($output_format == $format) {
 | |
|             $found = true;
 | |
|             $consumerClass = $def["writer"][1];
 | |
|             $consumer = new $consumerClass($output_file);
 | |
|             $output_encoding = self::$output_encoding;
 | |
|             if ($output_encoding !== null) {
 | |
|               $setOutputEncoding = $def["set_output_encoding"];
 | |
|               if ($setOutputEncoding) {
 | |
|                 $consumer->$setOutputEncoding($output_encoding);
 | |
|               }
 | |
|             }
 | |
|             break 2;
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|       if (!$found) {
 | |
|         throw new ValueException("$output_format: format invalide");
 | |
|       }
 | |
|     }
 | |
|     if ($consumer === null) {
 | |
|       foreach (self::DEFS as $def) {
 | |
|         $commandClass = $def["writer"][0];
 | |
|         $consumer = $commandClass::get(false);
 | |
|         if ($consumer !== null) break;
 | |
|       }
 | |
|     }
 | |
|     if ($consumer === null) {
 | |
|       foreach (self::DEFS as $def) {
 | |
|         $producerClass = $def["reader"][1];
 | |
|         $commandClass = $def["writer"][0];
 | |
|         if ($producer instanceof $producerClass) {
 | |
|           $consumer = $commandClass::get();
 | |
|           break;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     if ($producer === null) $producer = LineReader_command::get();
 | |
|     if ($consumer === null) $consumer = LineWriter_command::get();
 | |
| 
 | |
|     return [$producer, $consumer];
 | |
|   }
 | |
| }
 |