SeqAn3  3.0.2
The Modern C++ library for sequence analysis.
validators.hpp
Go to the documentation of this file.
1 // -----------------------------------------------------------------------------------------------------
2 // Copyright (c) 2006-2020, Knut Reinert & Freie Universität Berlin
3 // Copyright (c) 2016-2020, Knut Reinert & MPI für molekulare Genetik
4 // This file may be used, modified and/or redistributed under the terms of the 3-clause BSD-License
5 // shipped with this file and also available at: https://github.com/seqan/seqan3/blob/master/LICENSE.md
6 // -----------------------------------------------------------------------------------------------------
7 
13 #pragma once
14 
15 #include <regex>
16 #include <fstream>
17 #include <sstream>
18 
28 #include <seqan3/std/algorithm>
29 #include <seqan3/std/concepts>
30 #include <seqan3/std/filesystem>
31 #include <seqan3/std/ranges>
32 
33 namespace seqan3
34 {
35 
79 template <typename validator_type>
82 SEQAN3_CONCEPT validator = std::copyable<std::remove_cvref_t<validator_type>> &&
83  requires(validator_type validator,
85 {
87 
88  SEQAN3_RETURN_TYPE_CONSTRAINT(validator(value), std::same_as, void);
90 };
92 
106 {
107 public:
109  using option_value_type = double;
110 
116  min{min_}, max{max_}
117  {}
118 
123  void operator()(option_value_type const & cmp) const
124  {
125  if (!((cmp <= max) && (cmp >= min)))
126  throw validation_error{detail::to_string("Value ", cmp, " is not in range [", min, ",", max, "].")};
127  }
128 
135  template <std::ranges::forward_range range_type>
139  void operator()(range_type const & range) const
140  {
141  std::for_each(range.begin(), range.end(), [&] (auto cmp) { (*this)(cmp); });
142  }
143 
146  {
147  return detail::to_string("Value must be in range [", min, ",", max, "].");
148  }
149 
150 private:
152  option_value_type min{};
153 
155  option_value_type max{};
156 };
157 
175 template <typename option_value_t>
177 {
178 public:
180  using option_value_type = option_value_t;
181 
185  value_list_validator() = default;
190  ~value_list_validator() = default;
191 
197  template <std::ranges::forward_range range_type>
199  requires std::constructible_from<option_value_type, std::ranges::range_rvalue_reference_t<range_type>>
201  value_list_validator(range_type rng)
202  {
203  values.clear();
204  std::ranges::move(std::move(rng), std::cpp20::back_inserter(values));
205  }
206 
212  template <typename ...option_types>
214  requires ((std::constructible_from<option_value_type, option_types> && ...))
216  value_list_validator(option_types && ...opts)
217  {
218  (values.emplace_back(std::forward<option_types>(opts)), ...);
219  }
221 
226  void operator()(option_value_type const & cmp) const
227  {
228  if (!(std::find(values.begin(), values.end(), cmp) != values.end()))
229  throw validation_error{detail::to_string("Value ", cmp, " is not one of ", std::views::all(values), ".")};
230  }
231 
237  template <std::ranges::forward_range range_type>
239  requires std::convertible_to<std::ranges::range_value_t<range_type>, option_value_type>
241  void operator()(range_type const & range) const
242  {
243  std::for_each(std::ranges::begin(range), std::ranges::end(range), [&] (auto cmp) { (*this)(cmp); });
244  }
245 
248  {
249  return detail::to_string("Value must be one of ", std::views::all(values), ".");
250  }
251 
252 private:
253 
256 };
257 
262 template <arithmetic ...option_types>
265  requires (!(detail::is_char_adaptation_v<option_types> || ...))
267 value_list_validator(option_types...) -> value_list_validator<double>;
268 
270 template <typename range_type>
272  requires std::ranges::forward_range<std::decay_t<range_type>> &&
273  arithmetic<std::ranges::range_value_t<range_type>> &&
274  (!seqan3::detail::is_char_adaptation_v<std::ranges::range_value_t<range_type>>)
276 value_list_validator(range_type && rng) -> value_list_validator<double>;
277 
279 template <typename ...option_types>
281  requires (std::constructible_from<std::string, std::decay_t<option_types>> && ...)
283 value_list_validator(option_types...) -> value_list_validator<std::string>;
284 
286 template <typename range_type>
288  requires (std::ranges::forward_range<std::decay_t<range_type>> &&
289  std::constructible_from<std::string, std::ranges::range_value_t<range_type>>)
291 value_list_validator(range_type && rng) -> value_list_validator<std::string>;
292 
294 template <typename ...option_types>
295 value_list_validator(option_types...) -> value_list_validator<seqan3::pack_traits::front<option_types...>>;
296 
298 template <typename range_type>
300  requires (std::ranges::forward_range<std::decay_t<range_type>>)
302 value_list_validator(range_type && rng) -> value_list_validator<std::ranges::range_value_t<range_type>>;
304 
318 {
319 public:
320 
323 
327  file_validator_base() = default;
332  virtual ~file_validator_base() = default;
333 
342  virtual void operator()(std::filesystem::path const & path) const = 0;
343 
351  template <std::ranges::forward_range range_type>
353  requires std::convertible_to<std::ranges::range_value_t<range_type>, std::filesystem::path const &>
355  void operator()(range_type const & v) const
356  {
357  std::for_each(v.begin(), v.end(), [&] (auto cmp) { this->operator()(cmp); });
358  }
359 
360 protected:
366  void validate_filename(std::filesystem::path const & path) const
367  {
368  // If no valid extensions are given we can safely return here.
369  if (extensions.empty())
370  return;
371 
372  // Check if extension is available.
373  if (!path.has_extension())
374  throw validation_error{detail::to_string("The given filename ", path.string(),
375  " has no extension. Expected one of the following valid"
376  " extensions:", extensions, "!")};
377 
378  // Drop the dot.
379  std::string drop_less_ext = path.extension().string().substr(1);
380 
381  // Compares the extensions in lower case.
382  auto case_insensitive_equal_to = [&] (std::string const & ext)
383  {
384  return std::ranges::equal(ext, drop_less_ext, [] (char const chr1, char const chr2)
385  {
386  return std::tolower(chr1) == std::tolower(chr2);
387  });
388  };
389 
390  // Check if requested extension is present.
391  if (std::ranges::find_if(extensions, case_insensitive_equal_to) == extensions.end())
392  {
393  throw validation_error{detail::to_string("Expected one of the following valid extensions: ",
394  extensions, "! Got ", drop_less_ext, " instead!")};
395  }
396  }
397 
405  {
406  // Check if input directory is readable.
408  {
409  std::error_code ec{};
410  std::filesystem::directory_iterator{path, ec}; // if directory iterator cannot be created, ec will be set.
411  if (static_cast<bool>(ec))
412  throw validation_error{detail::to_string("Cannot read the directory ", path ,"!")};
413  }
414  else
415  {
416  // Must be a regular file.
418  throw validation_error{detail::to_string("Expected a regular file ", path, "!")};
419 
420  std::ifstream file{path};
421  if (!file.is_open() || !file.good())
422  throw validation_error{detail::to_string("Cannot read the file ", path, "!")};
423  }
424  }
425 
433  {
434  std::ofstream file{path};
435  detail::safe_filesystem_entry file_guard{path};
436 
437  bool is_open = file.is_open();
438  bool is_good = file.good();
439  file.close();
440 
441  if (!is_good || !is_open)
442  throw validation_error{detail::to_string("Cannot write ", path, "!")};
443 
444  file_guard.remove();
445  }
446 
449  {
450  if (extensions.empty())
451  return "";
452  else
453  return detail::to_string(" Valid file extensions are: [", extensions | views::join(std::string{", "}), "].");
454  }
455 
458 };
459 
482 template <typename file_t = void>
484 {
485 public:
486 
487  static_assert(std::same_as<file_t, void> || detail::has_type_valid_formats<file_t>,
488  "Expected either a template type with a static member called valid_formats (a file type) or void.");
489 
490  // Import from base class.
492 
506  {
507  if constexpr (!std::same_as<file_t, void>)
508  file_validator_base::extensions = detail::valid_file_extensions<typename file_t::valid_formats>();
509  }
510 
515  virtual ~input_file_validator() = default;
516 
527  requires std::same_as<file_t, void>
530  {
532  }
533 
534  // Import base class constructor.
537 
538  // Import the base::operator()
539  using file_validator_base::operator();
540 
546  virtual void operator()(std::filesystem::path const & file) const override
547  {
548  try
549  {
550  if (!std::filesystem::exists(file))
551  throw validation_error{detail::to_string("The file ", file, " does not exist!")};
552 
553  // Check if file is regular and can be opened for reading.
554  validate_readability(file);
555 
556  // Check extension.
557  validate_filename(file);
558  }
560  {
561  std::throw_with_nested(validation_error{"Unhandled filesystem error!"});
562  }
563  catch (...)
564  {
566  }
567  }
568 
571  {
572  return "The input file must exist and read permissions must be granted." +
574  }
575 };
576 
599 template <typename file_t = void>
601 {
602 public:
603 
604  static_assert(std::same_as<file_t, void> || detail::has_type_valid_formats<file_t>,
605  "Expected either a template type with a static member called valid_formats (a file type) or void.");
606 
607  // Import from base class.
609 
616  {
617  if constexpr (!std::same_as<file_t, void>)
618  file_validator_base::extensions = detail::valid_file_extensions<typename file_t::valid_formats>();
619  }
620 
625  virtual ~output_file_validator() = default;
626 
630  requires std::same_as<file_t, void>
633  {
635  }
636 
637  // Import base constructor.
640 
641  // Import the base::operator()
642  using file_validator_base::operator();
643 
649  virtual void operator()(std::filesystem::path const & file) const override
650  {
651  try
652  {
653  if (std::filesystem::exists(file))
654  throw validation_error{detail::to_string("The file ", file, " already exists!")};
655 
656  // Check if file has any write permissions.
657  validate_writeability(file);
658 
659  validate_filename(file);
660  }
662  {
663  std::throw_with_nested(validation_error{"Unhandled filesystem error!"});
664  }
665  catch (...)
666  {
668  }
669  }
670 
673  {
674  return "The output file must not exist already and write permissions must be granted." +
676  }
677 };
678 
694 {
695 public:
696  // Import from base class.
698 
707  virtual ~input_directory_validator() = default;
708 
709  // Import base constructor.
712 
713  // Import the base::operator()
714  using file_validator_base::operator();
715 
721  virtual void operator()(std::filesystem::path const & dir) const override
722  {
723  try
724  {
725  if (!std::filesystem::exists(dir))
726  throw validation_error{detail::to_string("The directory ", dir, " does not exists!")};
727 
729  throw validation_error{detail::to_string("The path ", dir, " is not a directory!")};
730 
731  // Check if directory has any read permissions.
733  }
735  {
736  std::throw_with_nested(validation_error{"Unhandled filesystem error!"});
737  }
738  catch (...)
739  {
741  }
742  }
743 
746  {
747  return detail::to_string("An existing, readable path for the input directory.");
748  }
749 };
750 
766 {
767 public:
768  // Imported from base class.
770 
779  virtual ~output_directory_validator() = default;
780 
781  // Import base constructor.
784 
785  // Import the base::operator().
786  using file_validator_base::operator();
787 
793  virtual void operator()(std::filesystem::path const & dir) const override
794  {
795  bool dir_exists = std::filesystem::exists(dir);
796  // Make sure the created dir is deleted after we are done.
797  std::error_code ec;
798  std::filesystem::create_directory(dir, ec); // does nothing and is not treated as error if path already exists.
799  // if error code was set or if dummy.txt could not be created within the output dir, throw an error.
800  if (static_cast<bool>(ec))
801  throw validation_error{detail::to_string("Cannot create directory: ", dir, "!")};
802 
803  try
804  {
805  if (!dir_exists)
806  {
807  detail::safe_filesystem_entry dir_guard{dir};
808  validate_writeability(dir / "dummy.txt");
809  dir_guard.remove_all();
810  }
811  else
812  {
813  validate_writeability(dir / "dummy.txt");
814  }
815  }
817  {
818  std::throw_with_nested(validation_error{"Unhandled filesystem error!"});
819  }
820  catch (...)
821  {
823  }
824  }
825 
828  {
829  return detail::to_string("A valid path for the output directory.");
830  }
831 };
832 
851 {
852 public:
855 
859  regex_validator(std::string const & pattern_) :
860  pattern{pattern_}
861  {}
862 
867  void operator()(option_value_type const & cmp) const
868  {
869  std::regex rgx(pattern);
870  if (!std::regex_match(cmp, rgx))
871  throw validation_error{detail::to_string("Value ", cmp, " did not match the pattern ", pattern, ".")};
872  }
873 
880  template <std::ranges::forward_range range_type>
882  requires std::convertible_to<std::ranges::range_value_t<range_type>, option_value_type const &>
884  void operator()(range_type const & v) const
885  {
886  std::for_each(v.begin(), v.end(), [&] (auto cmp) { (*this)(cmp); });
887  }
888 
891  {
892  return detail::to_string("Value must match the pattern '", pattern, "'.");
893  }
894 
895 private:
897  std::string pattern;
898 };
899 
900 namespace detail
901 {
902 
913 template <typename option_value_t>
914 struct default_validator
915 {
917  using option_value_type = option_value_t;
918 
920  void operator()(option_value_t const & /*cmp*/) const noexcept
921  {}
922 
925  {
926  return "";
927  }
928 };
929 
941 template <validator validator1_type, validator validator2_type>
943  requires std::same_as<typename validator1_type::option_value_type, typename validator2_type::option_value_type>
945 class validator_chain_adaptor
946 {
947 public:
949  using option_value_type = typename validator1_type::option_value_type;
950 
954  validator_chain_adaptor() = delete;
955  validator_chain_adaptor(validator_chain_adaptor const & pf) = default;
956  validator_chain_adaptor & operator=(validator_chain_adaptor const & pf) = default;
957  validator_chain_adaptor(validator_chain_adaptor &&) = default;
958  validator_chain_adaptor & operator=(validator_chain_adaptor &&) = default;
959 
964  validator_chain_adaptor(validator1_type vali1_, validator2_type vali2_) :
965  vali1{std::move(vali1_)}, vali2{std::move(vali2_)}
966  {}
967 
969  ~validator_chain_adaptor() = default;
971 
980  template <typename cmp_type>
982  requires std::invocable<validator1_type, cmp_type const> && std::invocable<validator2_type, cmp_type const>
984  void operator()(cmp_type const & cmp) const
985  {
986  vali1(cmp);
987  vali2(cmp);
988  }
989 
992  {
993  return detail::to_string(vali1.get_help_page_message(), " ", vali2.get_help_page_message());
994  }
995 
996 private:
998  validator1_type vali1;
1000  validator2_type vali2;
1001 };
1002 
1003 } // namespace detail
1004 
1032 template <validator validator1_type, validator validator2_type>
1034  requires std::same_as<typename std::remove_reference_t<validator1_type>::option_value_type,
1037 auto operator|(validator1_type && vali1, validator2_type && vali2)
1038 {
1039  return detail::validator_chain_adaptor{std::forward<validator1_type>(vali1),
1040  std::forward<validator2_type>(vali2)};
1041 }
1042 
1043 } // namespace seqan3
seqan3::value_list_validator::get_help_page_message
std::string get_help_page_message() const
Returns a message that can be appended to the (positional) options help page info.
Definition: validators.hpp:247
seqan3::output_file_validator::operator()
virtual void operator()(std::filesystem::path const &file) const override
Tests whether path is does not already exists and is writable.
Definition: validators.hpp:649
sstream
std::for_each
T for_each(T... args)
exceptions.hpp
Provides parser related exceptions.
seqan3::regex_validator::option_value_type
std::string option_value_type
Type of values that are tested by validator.
Definition: validators.hpp:854
seqan3::value_list_validator::operator=
value_list_validator & operator=(value_list_validator &&)=default
Defaulted.
seqan3::file_validator_base::operator()
virtual void operator()(std::filesystem::path const &path) const =0
Tests if the given path is a valid input, respectively output, file or directory.
regex
safe_filesystem_entry.hpp
Provides seqan3::detail::safe_filesystem_entry.
fstream
std::string
seqan3::output_file_validator::operator=
output_file_validator & operator=(output_file_validator &&)=default
Defaulted.
seqan3::value_list_validator::operator()
void operator()(range_type const &range) const
Tests whether every element in range lies inside values.
Definition: validators.hpp:241
seqan3::regex_validator
A validator that checks if a matches a regular expression pattern.
Definition: validators.hpp:851
seqan3::value_list_validator::value_list_validator
value_list_validator(value_list_validator &&)=default
Defaulted.
seqan3::file_validator_base::~file_validator_base
virtual ~file_validator_base()=default
std::vector< option_value_type >
seqan3::input_file_validator::operator()
virtual void operator()(std::filesystem::path const &file) const override
Tests whether path is an existing regular file and is readable.
Definition: validators.hpp:546
std::find
T find(T... args)
seqan3::file_validator_base::operator=
file_validator_base & operator=(file_validator_base &&)=default
Defaulted.
seqan3::input_directory_validator::operator()
virtual void operator()(std::filesystem::path const &dir) const override
Tests whether path is an existing directory and is readable.
Definition: validators.hpp:721
basic.hpp
Provides various type traits on generic types.
concept.hpp
Adaptations of concepts from the standard library.
std::regex_match
T regex_match(T... args)
seqan3::output_directory_validator::operator=
output_directory_validator & operator=(output_directory_validator &&)=default
Defaulted.
seqan3::input_file_validator::get_help_page_message
std::string get_help_page_message() const
Returns a message that can be appended to the (positional) options help page info.
Definition: validators.hpp:570
filesystem
This header includes C++17 filesystem support and imports it into namespace std::filesystem (independ...
std::filesystem::is_regular_file
T is_regular_file(T... args)
seqan3::arithmetic_range_validator
A validator that checks whether a number is inside a given range.
Definition: validators.hpp:106
seqan3::regex_validator::regex_validator
regex_validator(std::string const &pattern_)
Constructing from a vector.
Definition: validators.hpp:859
seqan3::output_directory_validator
A validator that checks if a given path is a valid output directory.
Definition: validators.hpp:766
std::filesystem::path
seqan3::input_directory_validator::input_directory_validator
input_directory_validator(input_directory_validator &&)=default
Defaulted.
algorithm
Adaptations of algorithms from the Ranges TS.
seqan3::operator|
auto operator|(validator1_type &&vali1, validator2_type &&vali2)
Enables the chaining of validators.
Definition: validators.hpp:1037
seqan3::value_list_validator::~value_list_validator
~value_list_validator()=default
Defaulted.
std::current_exception
T current_exception(T... args)
seqan3::file_validator_base::valid_extensions_help_page_message
std::string valid_extensions_help_page_message() const
Returns the information of valid file extensions.
Definition: validators.hpp:448
std::vector::clear
T clear(T... args)
concepts
The Concepts library.
seqan3::output_file_validator::output_file_validator
output_file_validator(output_file_validator const &)=default
Defaulted.
std::error_code
seqan3::regex_validator::get_help_page_message
std::string get_help_page_message() const
Returns a message that can be appended to the (positional) options help page info.
Definition: validators.hpp:890
seqan3::file_validator_base::extensions
std::vector< std::string > extensions
Stores the extensions.
Definition: validators.hpp:457
seqan3::input_file_validator
A validator that checks if a given path is a valid input file.
Definition: validators.hpp:484
seqan3::input_file_validator::input_file_validator
input_file_validator(std::vector< std::string > extensions)
Constructs from a given collection of valid extensions.
Definition: validators.hpp:525
validator::option_value_type
using option_value_type
The type of value on which the validator is called on.
seqan3::value_list_validator
A validator that checks whether a value is inside a list of valid values.
Definition: validators.hpp:177
seqan3::input_file_validator::input_file_validator
input_file_validator(input_file_validator &&)=default
Defaulted.
seqan3::value_list_validator::value_list_validator
value_list_validator()=default
Defaulted.
seqan3::input_directory_validator::get_help_page_message
std::string get_help_page_message() const
Returns a message that can be appended to the (positional) options help page info.
Definition: validators.hpp:745
seqan3::input_directory_validator::operator=
input_directory_validator & operator=(input_directory_validator const &)=default
Defaulted.
seqan3::file_validator_base
An abstract base class for the file and directory validators.
Definition: validators.hpp:318
seqan3::views::move
auto const move
A view that turns lvalue-references into rvalue-references.
Definition: move.hpp:68
std::filesystem::path::has_extension
T has_extension(T... args)
std::ofstream
std::filesystem::is_directory
T is_directory(T... args)
core_language.hpp
Provides concepts for core language types and relations that don't have concepts in C++20 (yet).
std::throw_with_nested
T throw_with_nested(T... args)
seqan3::value_list_validator::operator()
void operator()(option_value_type const &cmp) const
Tests whether cmp lies inside values.
Definition: validators.hpp:226
seqan3::file_validator_base::file_validator_base
file_validator_base()=default
Defaulted.
seqan3::value_list_validator::operator=
value_list_validator & operator=(value_list_validator const &)=default
Defaulted.
seqan3::input_directory_validator::operator=
input_directory_validator & operator=(input_directory_validator &&)=default
Defaulted.
seqan3
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
seqan3::arithmetic_range_validator::arithmetic_range_validator
arithmetic_range_validator(option_value_type const min_, option_value_type const max_)
The constructor.
Definition: validators.hpp:115
validator::get_help_page_message
std::string get_help_page_message() const
Returns a message that can be appended to the (positional) options help page info.
seqan3::pack_traits::find_if
constexpr ptrdiff_t find_if
Get the index of the first type in a pack that satisfies the given predicate.
Definition: traits.hpp:175
std::filesystem::filesystem_error
SEQAN3_RETURN_TYPE_CONSTRAINT
#define SEQAN3_RETURN_TYPE_CONSTRAINT(expression, concept_name,...)
Same as writing {expression} -> concept_name<type1[, ...]> in a concept definition.
Definition: platform.hpp:57
seqan3::output_directory_validator::~output_directory_validator
virtual ~output_directory_validator()=default
Virtual Destructor.
std::regex
seqan3::input_file_validator::operator=
input_file_validator & operator=(input_file_validator &&)=default
Defaulted.
seqan3::input_directory_validator::input_directory_validator
input_directory_validator(input_directory_validator const &)=default
Defaulted.
seqan3::pack_traits::front
typename decltype(detail::front< pack_t... >())::type front
Return the first type from the type pack.
Definition: traits.hpp:240
seqan3::input_file_validator::input_file_validator
input_file_validator()
Default constructor.
Definition: validators.hpp:505
seqan3::output_directory_validator::operator()
virtual void operator()(std::filesystem::path const &dir) const override
Tests whether path is writable.
Definition: validators.hpp:793
seqan3::output_file_validator::output_file_validator
output_file_validator()
Default constructor.
Definition: validators.hpp:615
seqan3::value_list_validator::option_value_type
option_value_t option_value_type
Type of values that are tested by validator.
Definition: validators.hpp:180
join.hpp
Provides seqan3::views::join.
seqan3::output_directory_validator::output_directory_validator
output_directory_validator()=default
Defaulted.
seqan3::input_file_validator::input_file_validator
input_file_validator(input_file_validator const &)=default
Defaulted.
ranges
Adaptations of concepts from the Ranges TS.
std::vector::emplace_back
T emplace_back(T... args)
std::remove_reference_t
seqan3::validation_error
Argument parser exception thrown when an argument could not be casted to the according type.
Definition: exceptions.hpp:141
std::filesystem::directory_iterator
seqan3::output_directory_validator::output_directory_validator
output_directory_validator(output_directory_validator const &)=default
Defaulted.
seqan3::regex_validator::operator()
void operator()(range_type const &v) const
Tests whether every filename in list v matches the pattern.
Definition: validators.hpp:884
seqan3::output_file_validator::~output_file_validator
virtual ~output_file_validator()=default
Virtual Destructor.
std::vector::begin
T begin(T... args)
seqan3::value_list_validator::value_list_validator
value_list_validator(value_list_validator const &)=default
Defaulted.
std
SeqAn specific customisations in the standard namespace.
seqan3::input_directory_validator::~input_directory_validator
virtual ~input_directory_validator()=default
Virtual Destructor.
seqan3::input_directory_validator::input_directory_validator
input_directory_validator()=default
Defaulted.
seqan3::arithmetic_range_validator::get_help_page_message
std::string get_help_page_message() const
Returns a message that can be appended to the (positional) options help page info.
Definition: validators.hpp:145
seqan3::output_directory_validator::operator=
output_directory_validator & operator=(output_directory_validator const &)=default
Defaulted.
seqan3::input_file_validator::~input_file_validator
virtual ~input_file_validator()=default
Virtual destructor.
validator
The concept for option validators passed to add_option/positional_option.
seqan3::output_directory_validator::output_directory_validator
output_directory_validator(output_directory_validator &&)=default
Defaulted.
std::filesystem::create_directory
T create_directory(T... args)
seqan3::arithmetic_range_validator::operator()
void operator()(option_value_type const &cmp) const
Tests whether cmp lies inside [min, max].
Definition: validators.hpp:123
to_string.hpp
Auxiliary for pretty printing of exception messages.
seqan3::output_file_validator::get_help_page_message
std::string get_help_page_message() const
Returns a message that can be appended to the (positional) options help page info.
Definition: validators.hpp:672
arithmetic
A type that satisfies std::is_arithmetic_v<t>.
seqan3::regex_validator::operator()
void operator()(option_value_type const &cmp) const
Tests whether cmp lies inside values.
Definition: validators.hpp:867
seqan3::file_validator_base::validate_readability
void validate_readability(std::filesystem::path const &path) const
Checks if the given path is readable.
Definition: validators.hpp:404
seqan3::file_validator_base::operator=
file_validator_base & operator=(file_validator_base const &)=default
Defaulted.
seqan3::output_file_validator::operator=
output_file_validator & operator=(output_file_validator const &)=default
Defaulted.
std::vector::end
T end(T... args)
seqan3::input_directory_validator
A validator that checks if a given path is a valid input directory.
Definition: validators.hpp:694
std::filesystem::path::extension
T extension(T... args)
seqan3::file_validator_base::validate_filename
void validate_filename(std::filesystem::path const &path) const
Validates the given filename path based on the specified extensions.
Definition: validators.hpp:366
validator::operator()
void operator()(option_value_type const &cmp) const
Validates the value 'cmp' and throws a seqan3::validation_error on failure.
std::rethrow_exception
T rethrow_exception(T... args)
misc.hpp
Provides various utility functions.
seqan3::input_file_validator::operator=
input_file_validator & operator=(input_file_validator const &)=default
Defaulted.
traits.hpp
Provides traits for seqan3::type_list.
seqan3::arithmetic_range_validator::operator()
void operator()(range_type const &range) const
Tests whether every element in range lies inside [min, max].
Definition: validators.hpp:139
std::filesystem::exists
T exists(T... args)
seqan3::output_file_validator
A validator that checks if a given path is a valid output file.
Definition: validators.hpp:601
seqan3::output_file_validator::output_file_validator
output_file_validator(std::vector< std::string > extensions)
Constructs from a given collection of valid extensions.
Definition: validators.hpp:628
seqan3::arithmetic_range_validator::option_value_type
double option_value_type
The type of value that this validator invoked upon.
Definition: validators.hpp:109
seqan3::output_directory_validator::get_help_page_message
std::string get_help_page_message() const
Returns a message that can be appended to the (positional) options help page info.
Definition: validators.hpp:827
seqan3::file_validator_base::validate_writeability
void validate_writeability(std::filesystem::path const &path) const
Checks if the given path is writable.
Definition: validators.hpp:432
seqan3::value_list_validator::value_list_validator
value_list_validator(range_type rng)
Constructing from a range.
Definition: validators.hpp:201
seqan3::file_validator_base::option_value_type
std::string option_value_type
Type of values that are tested by validator.
Definition: validators.hpp:322
seqan3::output_file_validator::output_file_validator
output_file_validator(output_file_validator &&)=default
Defaulted.
seqan3::file_validator_base::operator()
void operator()(range_type const &v) const
Tests whether every path in list v passes validation. See operator()(option_value_type const & value)...
Definition: validators.hpp:355
std::ifstream
std::filesystem::path::string
T string(T... args)