elasticctl_api/search/
dataview.rs1use elasticctl_core::{Error, ErrorKind, Result, Transport};
4use serde_json::Value;
5
6pub fn resolve_title(body: &Value, name: &str) -> Result<String> {
9 let views = body
10 .get("data_view")
11 .and_then(Value::as_array)
12 .ok_or_else(|| {
13 Error::new(
14 ErrorKind::Http,
15 "decoding data views response field `data_view`",
16 )
17 })?;
18 let matches: Vec<&Value> = views
19 .iter()
20 .filter(|v| {
21 v.get("id").and_then(Value::as_str) == Some(name)
22 || v.get("name").and_then(Value::as_str) == Some(name)
23 })
24 .collect();
25 match matches.as_slice() {
26 [] => Err(Error::new(
27 ErrorKind::NotFound,
28 format!("no data view with id or name '{name}'"),
29 )),
30 [one] => one
31 .get("title")
32 .and_then(Value::as_str)
33 .map(str::to_owned)
34 .ok_or_else(|| Error::new(ErrorKind::Http, "decoding data view field `title`")),
35 _ => Err(Error::new(
36 ErrorKind::Conflict,
37 format!("data view '{name}' is ambiguous"),
38 )),
39 }
40}
41
42pub async fn resolve(t: &Transport, name: &str) -> Result<String> {
44 let body = t.get("/api/data_views").await?;
45 resolve_title(&body, name)
46}
47
48pub async fn default_alerts_index(t: &Transport) -> Result<String> {
50 let body = t.get("/api/detection_engine/index").await?;
51 body.get("name")
52 .and_then(Value::as_str)
53 .map(str::to_owned)
54 .ok_or_else(|| {
55 Error::new(
56 ErrorKind::Http,
57 "decoding detection engine index field `name`",
58 )
59 })
60}