ESPHome 2026.5.0-dev
Loading...
Searching...
No Matches
filter.h
Go to the documentation of this file.
1#pragma once
2
4#ifdef USE_TEXT_SENSOR_FILTER
5
6#include <array>
7
10
11namespace esphome::text_sensor {
12
13class TextSensor;
14
20class Filter {
21 public:
30 virtual bool new_value(std::string &value) = 0;
31
33 virtual void initialize(TextSensor *parent, Filter *next);
34
35 void input(std::string value);
36
37 void output(std::string &value);
38
39 protected:
40 friend TextSensor;
41
42 Filter *next_{nullptr};
44};
45
46using lambda_filter_t = std::function<optional<std::string>(std::string)>;
47
54class LambdaFilter : public Filter {
55 public:
56 explicit LambdaFilter(lambda_filter_t lambda_filter);
57
58 bool new_value(std::string &value) override;
59
61 void set_lambda_filter(const lambda_filter_t &lambda_filter);
62
63 protected:
65};
66
73 public:
74 explicit StatelessLambdaFilter(optional<std::string> (*lambda_filter)(std::string)) : lambda_filter_(lambda_filter) {}
75
76 bool new_value(std::string &value) override {
77 auto result = this->lambda_filter_(value);
78 if (result.has_value()) {
79 value = std::move(*result);
80 return true;
81 }
82 return false;
83 }
84
85 protected:
86 optional<std::string> (*lambda_filter_)(std::string);
87};
88
90class ToUpperFilter : public Filter {
91 public:
92 bool new_value(std::string &value) override;
93};
94
96class ToLowerFilter : public Filter {
97 public:
98 bool new_value(std::string &value) override;
99};
100
102class AppendFilter : public Filter {
103 public:
104 explicit AppendFilter(const char *suffix) : suffix_(suffix) {}
105 bool new_value(std::string &value) override;
106
107 protected:
108 const char *suffix_;
109};
110
112class PrependFilter : public Filter {
113 public:
114 explicit PrependFilter(const char *prefix) : prefix_(prefix) {}
115 bool new_value(std::string &value) override;
116
117 protected:
118 const char *prefix_;
119};
120
122 const char *from;
123 const char *to;
124};
125
127bool substitute_filter_apply(const Substitution *substitutions, size_t count, std::string &value);
128
131template<size_t N> class SubstituteFilter : public Filter {
132 public:
133 explicit SubstituteFilter(const std::initializer_list<Substitution> &substitutions) {
134 init_array_from(this->substitutions_, substitutions);
135 }
136 bool new_value(std::string &value) override { return substitute_filter_apply(this->substitutions_.data(), N, value); }
137
138 protected:
139 std::array<Substitution, N> substitutions_{};
140};
141
143bool map_filter_apply(const Substitution *mappings, size_t count, std::string &value);
144
171template<size_t N> class MapFilter : public Filter {
172 public:
173 explicit MapFilter(const std::initializer_list<Substitution> &mappings) {
174 init_array_from(this->mappings_, mappings);
175 }
176 bool new_value(std::string &value) override { return map_filter_apply(this->mappings_.data(), N, value); }
177
178 protected:
179 std::array<Substitution, N> mappings_{};
180};
181
182} // namespace esphome::text_sensor
183
184#endif // USE_TEXT_SENSOR_FILTER
A simple filter that adds a string to the end of another string.
Definition filter.h:102
bool new_value(std::string &value) override
Definition filter.cpp:65
AppendFilter(const char *suffix)
Definition filter.h:104
Apply a filter to text sensor values such as to_upper.
Definition filter.h:20
virtual bool new_value(std::string &value)=0
This will be called every time the filter receives a new value.
void output(std::string &value)
Definition filter.cpp:19
void input(std::string value)
Definition filter.cpp:14
virtual void initialize(TextSensor *parent, Filter *next)
Initialize this filter, please note this can be called more than once.
Definition filter.cpp:28
This class allows for creation of simple template filters.
Definition filter.h:54
lambda_filter_t lambda_filter_
Definition filter.h:64
LambdaFilter(lambda_filter_t lambda_filter)
Definition filter.cpp:35
void set_lambda_filter(const lambda_filter_t &lambda_filter)
Definition filter.cpp:37
bool new_value(std::string &value) override
Definition filter.cpp:39
const lambda_filter_t & get_lambda_filter() const
Definition filter.cpp:36
A filter that maps values from one set to another.
Definition filter.h:171
std::array< Substitution, N > mappings_
Definition filter.h:179
bool new_value(std::string &value) override
Definition filter.h:176
MapFilter(const std::initializer_list< Substitution > &mappings)
Definition filter.h:173
A simple filter that adds a string to the start of another string.
Definition filter.h:112
bool new_value(std::string &value) override
Definition filter.cpp:71
PrependFilter(const char *prefix)
Definition filter.h:114
Optimized lambda filter for stateless lambdas (no capture).
Definition filter.h:72
optional< std::string >(* lambda_filter_)(std::string)
Definition filter.h:86
StatelessLambdaFilter(optional< std::string >(*lambda_filter)(std::string))
Definition filter.h:74
bool new_value(std::string &value) override
Definition filter.h:76
A simple filter that replaces a substring with another substring.
Definition filter.h:131
bool new_value(std::string &value) override
Definition filter.h:136
std::array< Substitution, N > substitutions_
Definition filter.h:139
SubstituteFilter(const std::initializer_list< Substitution > &substitutions)
Definition filter.h:133
A simple filter that converts all text to lowercase.
Definition filter.h:96
bool new_value(std::string &value) override
Definition filter.cpp:58
A simple filter that converts all text to uppercase.
Definition filter.h:90
bool new_value(std::string &value) override
Definition filter.cpp:51
std::function< optional< std::string >(std::string)> lambda_filter_t
Definition filter.h:46
bool map_filter_apply(const Substitution *mappings, size_t count, std::string &value)
Non-template helper (implementation in filter.cpp)
Definition filter.cpp:91
bool substitute_filter_apply(const Substitution *substitutions, size_t count, std::string &value)
Non-template helper (implementation in filter.cpp)
Definition filter.cpp:77
void init_array_from(std::array< T, N > &dest, std::initializer_list< T > src)
Initialize a std::array from an initializer_list.
Definition helpers.h:505