#pragma once #include namespace program { class ProgramArgumentsError : public std::logic_error { using std::logic_error::logic_error; }; class ArgumentMixingError : public ProgramArgumentsError { public: ArgumentMixingError() : ProgramArgumentsError("Cannot mix together argument() and action() clauses in a program") {} }; class ArgumentStructureError : public ProgramArgumentsError { public: ArgumentStructureError(std::string const & desc, std::string const & name) : ProgramArgumentsError(desc + " for argument " + name) {} }; class NotAnArgumentError : public ProgramArgumentsError { public: NotAnArgumentError(std::string const & name) : ProgramArgumentsError("Unknown argument provided: " + name) {} }; class IllegalPositionError : public ProgramArgumentsError { public: IllegalPositionError(std::string const & desc, size_t index) : ProgramArgumentsError(desc + " at index " + std::to_string(index)) {} }; }