| 298 | } |
| 299 | |
| 300 | fn maestro_selector(value: &YamlValue) -> anyhow::Result<Value> { |
| 301 | if let Some(text) = value.as_str() { |
| 302 | return Ok(serde_json::json!({ "text": text, "regex": true })); |
| 303 | } |
| 304 | let Some(mapping) = value.as_mapping() else { |
| 305 | anyhow::bail!("Selector must be a string or mapping."); |
| 306 | }; |
| 307 | let text = yaml_string_field(mapping, "text"); |
| 308 | let explicit_regex = yaml_bool_field(mapping, "regex"); |
| 309 | let use_regex = explicit_regex.unwrap_or_else(|| text.is_some()); |
| 310 | let id = yaml_string_field(mapping, "id").map(|id| { |
| 311 | if use_regex && explicit_regex != Some(true) { |
| 312 | anchored_regex_literal(&id) |
| 313 | } else { |
| 314 | id |
| 315 | } |
| 316 | }); |
| 317 | Ok(serde_json::json!({ |
| 318 | "text": text, |
| 319 | "id": id, |
| 320 | "label": yaml_string_field(mapping, "label"), |
| 321 | "value": yaml_string_field(mapping, "value"), |
| 322 | "elementType": yaml_string_field(mapping, "type"), |
| 323 | "index": yaml_u64_field(mapping, "index"), |
| 324 | "enabled": yaml_bool_field(mapping, "enabled"), |
| 325 | "checked": yaml_bool_field(mapping, "checked"), |
| 326 | "focused": yaml_bool_field(mapping, "focused"), |
| 327 | "selected": yaml_bool_field(mapping, "selected"), |
| 328 | "regex": use_regex, |
| 329 | })) |
| 330 | } |
| 331 | |
| 332 | fn anchored_regex_literal(value: &str) -> String { |
| 333 | format!("^{}$", regex::escape(value)) |