#ifndef PANTOR_INJA_PARSED_HPP #define PANTOR_INJA_PARSED_HPP #include #include namespace inja { using json = nlohmann::json; enum class ElementNotation { Dot, Pointer }; struct Parsed { enum class Type { Comment, Condition, ConditionBranch, Expression, Loop, Main, String }; enum class Delimiter { Comment, Expression, LineStatement, Statement }; enum class Statement { Condition, Include, Loop }; enum class Function { Not, And, Or, In, Equal, Greater, GreaterEqual, Less, LessEqual, Different, Callback, DivisibleBy, Even, First, Float, Int, Last, Length, Lower, Max, Min, Odd, Range, Result, Round, Sort, Upper, ReadJson, Exists, ExistsInObject, IsBoolean, IsNumber, IsInteger, IsFloat, IsObject, IsArray, IsString, Default }; enum class Condition { If, ElseIf, Else }; enum class Loop { ForListIn, ForMapIn }; struct Element { Type type; std::string inner; std::vector> children; explicit Element(): Element(Type::Main, "") { } explicit Element(const Type type): Element(type, "") { } explicit Element(const Type type, const std::string& inner): type(type), inner(inner), children({}) { } }; struct ElementString: public Element { const std::string text; explicit ElementString(const std::string& text): Element(Type::String), text(text) { } }; struct ElementComment: public Element { const std::string text; explicit ElementComment(const std::string& text): Element(Type::Comment), text(text) { } }; struct ElementExpression: public Element { Function function; std::vector args; std::string command; json result; explicit ElementExpression(): ElementExpression(Function::ReadJson) { } explicit ElementExpression(const Function function_): Element(Type::Expression), function(function_), args({}), command("") { } }; struct ElementLoop: public Element { Loop loop; const std::string key; const std::string value; const ElementExpression list; explicit ElementLoop(const Loop loop_, const std::string& value, const ElementExpression& list, const std::string& inner): Element(Type::Loop, inner), loop(loop_), value(value), list(list) { } explicit ElementLoop(const Loop loop_, const std::string& key, const std::string& value, const ElementExpression& list, const std::string& inner): Element(Type::Loop, inner), loop(loop_), key(key), value(value), list(list) { } }; struct ElementConditionContainer: public Element { explicit ElementConditionContainer(): Element(Type::Condition) { } }; struct ElementConditionBranch: public Element { const Condition condition_type; const ElementExpression condition; explicit ElementConditionBranch(const std::string& inner, const Condition condition_type): Element(Type::ConditionBranch, inner), condition_type(condition_type) { } explicit ElementConditionBranch(const std::string& inner, const Condition condition_type, const ElementExpression& condition): Element(Type::ConditionBranch, inner), condition_type(condition_type), condition(condition) { } }; using Arguments = std::vector; using CallbackSignature = std::pair; }; } #endif // PANTOR_INJA_PARSED_HPP