45 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C++
		
	
	
	
| #pragma once
 | |
| 
 | |
| #include <json/json.h>
 | |
| 
 | |
| #include <functional>
 | |
| #include <regex>
 | |
| #include <string>
 | |
| 
 | |
| namespace waybar::util {
 | |
| 
 | |
| struct Rule {
 | |
|   std::regex rule;
 | |
|   std::string repr;
 | |
|   int priority;
 | |
| };
 | |
| 
 | |
| int default_priority_function(std::string& key);
 | |
| 
 | |
| /* A collection of regexes and strings, with a default string to return if no regexes.
 | |
|  * When a regex is matched, the corresponding string is returned.
 | |
|  * All regexes that are matched are cached, so that the regexes are only
 | |
|  * evaluated once against a given string.
 | |
|  * Regexes may be given a higher priority than others, so that they are matched
 | |
|  * first. The priority function is given the regex string, and should return a
 | |
|  * higher number for higher priority regexes.
 | |
|  */
 | |
| class RegexCollection {
 | |
|  private:
 | |
|   std::vector<Rule> rules;
 | |
|   std::map<std::string, std::string> regex_cache;
 | |
|   std::string default_repr;
 | |
| 
 | |
|   std::string& find_match(std::string& value, bool& matched_any);
 | |
| 
 | |
|  public:
 | |
|   RegexCollection() = default;
 | |
|   RegexCollection(const Json::Value& map, std::string default_repr = "",
 | |
|                   std::function<int(std::string&)> priority_function = default_priority_function);
 | |
|   ~RegexCollection() = default;
 | |
| 
 | |
|   std::string& get(std::string& value, bool& matched_any);
 | |
|   std::string& get(std::string& value);
 | |
| };
 | |
| 
 | |
| }  // namespace waybar::util
 |