diff --git a/src/FileSystem.php b/src/FileSystem.php index 2c55272..c137425 100644 --- a/src/FileSystem.php +++ b/src/FileSystem.php @@ -10,8 +10,17 @@ use PmConverter\Exceptions\{ DirectoryIsNotWriteableException, DirectoryNotExistsException}; +/** + * Helper class to work with files and directories + */ class FileSystem { + /** + * Normalizes a given path + * + * @param string $path + * @return string + */ public static function normalizePath(string $path): string { $path = str_replace('~', $_SERVER['HOME'], $path); @@ -19,6 +28,8 @@ class FileSystem } /** + * Recursively creates a new directory by given path + * * @param string $path * @return string * @throws CannotCreateDirectoryException @@ -38,6 +49,8 @@ class FileSystem } /** + * Recursively removes a given directory + * * @param string $path * @return void * @throws DirectoryIsNotReadableException @@ -77,11 +90,10 @@ class FileSystem } /** + * Returns content of given directory path + * * @param string $path * @return array - * @throws DirectoryIsNotReadableException - * @throws DirectoryIsNotWriteableException - * @throws DirectoryNotExistsException */ public static function dirContents(string $path): array { @@ -92,4 +104,22 @@ class FileSystem } return $records; } + + /** + * Checks if a given file is a valid collection json file + * + * @param string $path + * @return bool + */ + public static function isCollectionFile(string $path): bool + { + $path = static::normalizePath($path); + return !empty($path = trim($path)) + && str_ends_with($path, '.postman_collection.json') + && file_exists($path) + && is_readable($path) + && ($json = json_decode(file_get_contents($path), true)) + && json_last_error() === JSON_ERROR_NONE + && isset($json['collection']['info']['name']); + } } diff --git a/src/Processor.php b/src/Processor.php index 945c434..382296e 100644 --- a/src/Processor.php +++ b/src/Processor.php @@ -92,47 +92,58 @@ class Processor switch ($arg) { case '-f': case '--file': - $path = FileSystem::normalizePath($this->argv[$idx + 1]); - if (empty($path) || !str_ends_with($path, '.json') || !file_exists($path) || !is_readable($path)) { - throw new InvalidArgumentException('a valid json-file path is expected for -f (--file)'); + $rawpath = $this->argv[$idx + 1]; + $normpath = FileSystem::normalizePath($rawpath); + if (!FileSystem::isCollectionFile($normpath)) { + throw new InvalidArgumentException( + sprintf("this is not a valid collection file:%s\t%s %s", PHP_EOL, $arg, $rawpath) + ); } $this->collectionPaths[] = $this->argv[$idx + 1]; break; + case '-o': case '--output': if (empty($this->argv[$idx + 1])) { - throw new InvalidArgumentException('-o expected'); + throw new InvalidArgumentException('-o is required'); } $this->outputPath = $this->argv[$idx + 1]; break; + case '-d': case '--dir': if (empty($this->argv[$idx + 1])) { throw new InvalidArgumentException('a directory path is expected for -d (--dir)'); } - $path = $this->argv[$idx + 1]; + $normpath = $this->argv[$idx + 1]; $files = array_filter( - FileSystem::dirContents($path), - static fn($filename) => str_ends_with($filename, '.json') + FileSystem::dirContents($normpath), + static fn($filename) => FileSystem::isCollectionFile($filename) ); $this->collectionPaths = array_unique(array_merge($this?->collectionPaths ?? [], $files)); break; + case '-p': case '--preserve': $this->preserveOutput = true; break; + case '--http': $this->formats[ConvertFormat::Http->name] = ConvertFormat::Http; break; + case '--curl': $this->formats[ConvertFormat::Curl->name] = ConvertFormat::Curl; break; + case '--wget': $this->formats[ConvertFormat::Wget->name] = ConvertFormat::Wget; break; + case '-v': case '--version': die(implode(PHP_EOL, $this->version()) . PHP_EOL); + case '-h': case '--help': die(implode(PHP_EOL, $this->usage()) . PHP_EOL);