1 #pragma once
2 
3 #include "common.hpp"
4 #include "errors.hpp"
5 #include "utils/color.hpp"
6 
7 POLYBAR_NS
8 
9 class signal_emitter;
10 enum class attribute;
11 enum class controltag;
12 enum class mousebtn;
13 struct bar_settings;
14 
15 DEFINE_ERROR(parser_error);
16 DEFINE_CHILD_ERROR(unrecognized_token, parser_error);
17 DEFINE_CHILD_ERROR(unrecognized_attribute, parser_error);
18 DEFINE_CHILD_ERROR(unclosed_actionblocks, parser_error);
19 
20 class parser {
21  public:
22   using make_type = unique_ptr<parser>;
23   static make_type make();
24 
25  public:
26   explicit parser(signal_emitter& emitter);
27   void parse(const bar_settings& bar, string data);
28 
29  protected:
30   void codeblock(string&& data, const bar_settings& bar);
31   size_t text(string&& data);
32 
33   static rgba parse_color(const string& s, rgba fallback = rgba{0});
34   static int parse_fontindex(const string& s);
35   static attribute parse_attr(const char attr);
36   mousebtn parse_action_btn(const string& data);
37   static string parse_action_cmd(string&& data);
38   static controltag parse_control(const string& data);
39 
40  private:
41   signal_emitter& m_sig;
42   vector<int> m_actions;
43   unique_ptr<parser> m_parser;
44 };
45 
46 POLYBAR_NS_END
47