#pragma once #include #include #include "ast/ast_base.hpp" #include "ast_token.hpp" #include "lexer.hpp" #include "util/text.hpp" namespace fsh { class CommandArgumentNode : public AstNode { public: static std::shared_ptr build(std::list::iterator& it); Lexer::TokenType gtoken_type() { return type; } std::string& gvalue() { return value; } protected: CommandArgumentNode(TokenNode::shared word) : AstNode(NodeType::COMMAND_ARGUMENT, "StringArgument"), type(word->gtoken_type()), value(word->gvalue()) {} CommandArgumentNode(TokenNode::shared word) : AstNode(NodeType::COMMAND_ARGUMENT, "StringArgument"), type(word->gtoken_type()), value(word->gvalue()) {} private: Lexer::TokenType type; std::string value; }; class LRedirectNode : public AstNode { public: static std::shared_ptr build(std::list::iterator& it); std::string gvalue() { return input; } protected: LRedirectNode(TokenNode::shared, TokenNode::shared in) : AstNode(NodeType::LREDIRECTS, "LRedirectNode"), input(in->gvalue()) {} private: std::string input; }; class RRedirectNode : public AstNode { public: static std::shared_ptr build(std::list::iterator& it); std::string gvalue() { return output; } bool gappend() { return append; } protected: RRedirectNode(TokenNode::shared rr, TokenNode::shared out) : AstNode(NodeType::RREDIRECTS, "LRedirectNode"), output(out->gvalue()), append(rr->gvalue().size() > 1) {} private: std::string output; bool append; }; class RedirectsNode : public AstNode { public: static std::shared_ptr build(std::list::iterator& it); std::optional ginput() { return input; } std::optional goutput() { return output; } bool gappend() { return append; } protected: RedirectsNode(std::shared_ptr in, std::shared_ptr out) : AstNode(NodeType::REDIRECTS, "RedirectNode"), input(util::mk_optional(in)), output(util::mk_optional(out)) { if (out) append = out->gappend(); } private: std::optional input; std::optional output; bool append = false; }; }