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(), } } }