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];
 | 
						|
  }
 | 
						|
}
 |