From 3ab8954c8de23af19bfa0e6db580c739970c198a Mon Sep 17 00:00:00 2001 From: Rafi Wiener Date: Mon, 4 Mar 2019 14:50:51 +0200 Subject: [PATCH] add read and write file validators #249 Signed-off-by: Rafi Wiener --- README.md | 2 ++ include/CLI/Validators.hpp | 13 +++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 69eeb4aca..0877bc9af 100644 --- a/README.md +++ b/README.md @@ -337,6 +337,8 @@ CLI11 has several Validators built in that perform some common checks - `CLI::Transformer(...)`: 🚧 Modify the input using a map. See [Transforming Validators](#transforming-validators) for more details. - `CLI::CheckedTransformer(...)`: 🚧 Modify the input using a map, and Require that the input is either in the set or already one of the outputs of the set. See [Transforming Validators](#transforming-validators) for more details. - `CLI::ExistingFile`: Requires that the file exists if given. +- `CLI::ExistingReadFile`: Requires that the file given exists and have permission to read it. +- `CLI::ExistingWriteFile`: Requires that the file given exists and have permission to write to it. - `CLI::ExistingDirectory`: Requires that the directory exists. - `CLI::ExistingPath`: Requires that the path (file or directory) exists. - `CLI::NonexistentPath`: Requires that the path does not exist. diff --git a/include/CLI/Validators.hpp b/include/CLI/Validators.hpp index a549194b1..5c0904144 100644 --- a/include/CLI/Validators.hpp +++ b/include/CLI/Validators.hpp @@ -216,8 +216,8 @@ namespace detail { /// Check for an existing file (returns error message if check fails) class ExistingFileValidator : public Validator { public: - ExistingFileValidator() : Validator("FILE") { - func_ = [](std::string &filename) { + ExistingFileValidator(unsigned short mode = 0) : Validator("FILE") { + func_ = [mode](std::string &filename) { struct stat buffer; bool exist = stat(filename.c_str(), &buffer) == 0; bool is_dir = (buffer.st_mode & S_IFDIR) != 0; @@ -226,6 +226,9 @@ class ExistingFileValidator : public Validator { } else if(is_dir) { return "File is actually a directory: " + filename; } + if (mode && !(buffer.st_mode & mode)) { + return "File doesn't have the wanted permission: " + filename; + } return std::string(); }; } @@ -328,6 +331,12 @@ class PositiveNumber : public Validator { /// Check for existing file (returns error message if check fails) const detail::ExistingFileValidator ExistingFile; +/// Check that the file exist and available for read +const detail::ExistingFileValidator ExistingReadFile(S_IREAD); + +/// Check that the file exist and available for write +const detail::ExistingFileValidator ExistingWriteFile(S_IWRITE); + /// Check for an existing directory (returns error message if check fails) const detail::ExistingDirectoryValidator ExistingDirectory;