diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/ninja/Ninja.hpp | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/include/ninja/Ninja.hpp b/include/ninja/Ninja.hpp new file mode 100644 index 0000000..cd9be0a --- /dev/null +++ b/include/ninja/Ninja.hpp @@ -0,0 +1,100 @@ +#pragma once + +#include <string> +#include <unordered_map> +#include <stdexcept> +#include <vector> + +namespace ninja +{ + enum class NinjaError + { + NONE, + VARIABLE_ALREADY_DEFINED, + RULE_ALREADY_DEFINED, + RULE_AREADY_BUILT + }; + + class NinjaException : public std::runtime_error + { + public: + NinjaException(const NinjaError _errorCode, const std::string &errMsg = "") : + std::runtime_error(errMsg), + errorCode(_errorCode) + { + + } + + const NinjaError errorCode; + }; + + struct NinjaVariable + { + const std::string name; + }; + + class NinjaBuildFile; + + class NinjaArg + { + public: + enum class Type + { + NONE, + VALUE, + VARIABLE + }; + + NinjaArg() : type(Type::NONE) {} + NinjaArg(const std::string &value) : type(Type::VALUE), arg(value) {} + NinjaArg(const NinjaVariable &var) : type(Type::VARIABLE), arg(var.name) {} + + Type type; + std::string arg; + }; + + struct NinjaArgValue + { + const NinjaVariable arg; + const std::string value; + }; + + // Functions throw NinjaException on failure + class NinjaRule + { + public: + NinjaRule(NinjaBuildFile *buildFile, const std::string &name, const std::string &command); + void build(const std::string &in, const std::string &out, const std::vector<ninja::NinjaArgValue> &additionalArgs); + + const std::string name; + const std::string command; + std::string depFile; + private: + NinjaBuildFile *buildFile; + }; + + struct NinjaBuild + { + const NinjaRule *rule; + const std::string in; + const std::string out; + const std::vector<ninja::NinjaArgValue> additionalArgs; + }; + + // Functions throw NinjaException on failure + class NinjaBuildFile + { + public: + ~NinjaBuildFile(); + + void defineGlobalVariable(const std::string &name, const std::string &value); + NinjaRule* createRule(const std::string &name, const std::vector<NinjaArg> &commandArgs); + void build(const NinjaRule *rule, const std::string &in, const std::string &out, const std::vector<ninja::NinjaArgValue> &additionalArgs); + + std::string generate() const; + private: + std::unordered_map<std::string, std::string> globalVariables; + std::unordered_map<std::string, NinjaRule*> rules; + std::vector<NinjaBuild> builds; + }; +}
\ No newline at end of file |