| 258 | } |
| 259 | |
| 260 | Rv<Expr> |
| 261 | Config::parse_unquoted_expr(swoc::TextView const &text) |
| 262 | { |
| 263 | // Integer? |
| 264 | TextView parsed; |
| 265 | auto n = swoc::svtoi(text, &parsed); |
| 266 | if (parsed.size() == text.size()) { |
| 267 | return Expr{Feature{n}}; |
| 268 | } |
| 269 | |
| 270 | // bool? |
| 271 | auto b = BoolNames[text]; |
| 272 | if (b != BoolTag::INVALID) { |
| 273 | return Expr{Feature{b == BoolTag::True}}; |
| 274 | } |
| 275 | |
| 276 | // float? |
| 277 | double f = swoc::svtod(text, &parsed); |
| 278 | if (parsed.size() == text.size()) { |
| 279 | return Expr{Feature{f}}; |
| 280 | } |
| 281 | |
| 282 | // IP Address? |
| 283 | swoc::IPAddr addr; |
| 284 | if (addr.load(text)) { |
| 285 | return Expr{Feature{addr}}; |
| 286 | } |
| 287 | |
| 288 | // Presume an extractor. |
| 289 | Extractor::Spec spec; |
| 290 | bool valid_p = spec.parse(text); |
| 291 | if (!valid_p) { |
| 292 | return Errata(S_ERROR, R"(Invalid syntax for extractor "{}" - not a valid specifier.)", text); |
| 293 | } |
| 294 | auto &&[vt, errata] = this->validate(spec); |
| 295 | if (!errata.is_ok()) { |
| 296 | return std::move(errata); |
| 297 | } |
| 298 | |
| 299 | if (vt.is_cfg_const()) { |
| 300 | return Expr{spec._exf->extract(*this, spec)}; |
| 301 | } |
| 302 | |
| 303 | return Expr{spec, vt}; |
| 304 | } |
| 305 | |
| 306 | Rv<Expr> |
| 307 | Config::parse_composite_expr(TextView const &text) |