MCPcopy Create free account
hub / github.com/apache/trafficserver / load

Method load

plugins/experimental/txn_box/plugin/src/stats.cc:131–223  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

129}
130
131Rv<Directive::Handle>
132Do_stat_define::load(Config &cfg, CfgStaticData const *, YAML::Node drtv_node, swoc::TextView const &, swoc::TextView const &,
133 YAML::Node key_value)
134{
135 auto self = new self_type();
136 Handle handle(self);
137
138 // Prefix is optional - defaults to "plugin.txn_box"
139 // Need this before the name so it can be combined as needed.
140 auto prefix_node = key_value[PREFIX_TAG];
141 TextView prefix;
142 if (prefix_node) {
143 auto &&[prefix_expr, prefix_errata]{cfg.parse_expr(prefix_node)};
144 if (!prefix_errata.is_ok()) {
145 prefix_errata.note("While parsing {} directive at {}.", KEY, drtv_node.Mark());
146 return std::move(prefix_errata);
147 }
148 if (!prefix_expr.is_literal() || !prefix_expr.result_type().can_satisfy(STRING)) {
149 return Errata(S_ERROR, "{} value at {} for {} directive at {} must be a literal string.", PREFIX_TAG, prefix_node.Mark(), KEY,
150 drtv_node.Mark());
151 }
152
153 prefix = std::get<IndexFor(STRING)>(std::get<Expr::LITERAL>(prefix_expr._raw));
154 drtv_node.remove(prefix_node);
155 } else {
156 prefix = "plugin.txn_box"_tv; // default if not explicitly set.
157 }
158 // Note - prefix isn't localized yet, need to wait for name.
159
160 auto name_node = key_value[NAME_TAG];
161 if (!name_node) {
162 return Errata(S_ERROR, "{} directive at {} must have a {} key.", KEY, drtv_node.Mark(), NAME_TAG);
163 }
164
165 auto &&[name_expr, name_errata]{cfg.parse_expr(name_node)};
166 if (!name_errata.is_ok()) {
167 name_errata.note("While parsing {} directive at {}.", KEY, drtv_node.Mark());
168 return std::move(name_errata);
169 }
170 if (!name_expr.is_literal() || !name_expr.result_type().can_satisfy(STRING)) {
171 return Errata(S_ERROR, "{} value at {} for {} directive at {} must be a literal string.", NAME_TAG, name_node.Mark(), KEY,
172 drtv_node.Mark());
173 }
174 TextView name = std::get<IndexFor(STRING)>(std::get<Expr::LITERAL>(name_expr._raw));
175 if (name.empty()) {
176 return Errata(S_ERROR, "{} value at {} for {} directive at {} must be a non-empty literal string.", NAME_TAG, name_node.Mark(),
177 KEY, drtv_node.Mark());
178 }
179
180 // Localize prefix and name in the same string, storing views in to that string.
181 if (prefix.empty()) {
182 self->_full_name = self->_name = cfg.localize(name, Config::LOCAL_CSTR);
183 } else {
184 swoc::FixedBufferWriter w{cfg.allocate_cfg_storage(prefix.size() + 1 + name.size() + 1)};
185 w.write(prefix).write('.').write(name).write('\0');
186 self->_full_name = TextView{w.view()}.remove_suffix(1); // drop terminal null.
187 self->_name = self->_full_name.suffix(name.size());
188 }

Callers

nothing calls this directly

Calls 15

ErrataClass · 0.85
parse_exprMethod · 0.80
can_satisfyMethod · 0.80
allocate_cfg_storageMethod · 0.80
is_okMethod · 0.45
noteMethod · 0.45
MarkMethod · 0.45
is_literalMethod · 0.45
result_typeMethod · 0.45
removeMethod · 0.45
emptyMethod · 0.45
localizeMethod · 0.45

Tested by

no test coverage detected