1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
use super::definitions::Filter;
use super::definitions::Granularity;
use super::definitions::SortingOrder;
use super::DataSource;
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
#[serde(tag = "queryType", rename = "search")]
pub struct Search {
    pub data_source: DataSource,
    pub granularity: Granularity,
    pub filter: Option<Filter>,
    pub limit: usize,
    pub intervals: Vec<String>,
    pub search_dimensions: Vec<String>,
    pub query: SearchQuerySpec,
    pub sort: Option<SortingOrder>,
    pub context: std::collections::HashMap<String, String>,
}

#[derive(Serialize, Deserialize, Debug)]
#[serde(rename_all = "snake_case")]
#[serde(tag = "type")]
pub enum SearchQuerySpec {
    #[serde(rename_all = "camelCase")]
    InsensitiveContains { value: String },
    #[serde(rename_all = "camelCase")]
    Fragment {
        case_sensitive: bool,
        values: Vec<String>,
    },
    #[serde(rename_all = "camelCase")]
    Contains { case_sensitive: bool, value: String },
    #[serde(rename_all = "camelCase")]
    Regex { pattern: String },
}

impl SearchQuerySpec {
    pub fn contains_insensitive(value: &str) -> Self {
        SearchQuerySpec::InsensitiveContains {
            value: value.to_string(),
        }
    }

    pub fn constain(value: &str, case_sensitive: bool) -> Self {
        SearchQuerySpec::Contains {
            value: value.to_string(),
            case_sensitive: case_sensitive,
        }
    }
    pub fn fragment(values: Vec<&str>, case_sensitive: bool) -> Self {
        SearchQuerySpec::Fragment {
            values: values.iter().map(|s| s.to_string()).collect(),
            case_sensitive: case_sensitive,
        }
    }

    pub fn regrex(pattern: &str) -> Self {
        SearchQuerySpec::Regex {
            pattern: pattern.to_string(),
        }
    }
}