use std::collections::{BTreeMap, BTreeSet}; use std::result::Result as StdResult; use serde::{Deserialize, Deserializer, Serialize}; #[derive(Default, Clone, Serialize, Deserialize, Debug)] #[serde(rename_all = "camelCase", deny_unknown_fields)] pub struct Settings { #[serde(default, deserialize_with = "deserialize_some")] pub ranking_rules: Option>>, #[serde(default, deserialize_with = "deserialize_some")] pub distinct_attribute: Option>, #[serde(default, deserialize_with = "deserialize_some")] pub searchable_attributes: Option>>, #[serde(default, deserialize_with = "deserialize_some")] pub displayed_attributes: Option>>, #[serde(default, deserialize_with = "deserialize_some")] pub stop_words: Option>>, #[serde(default, deserialize_with = "deserialize_some")] pub synonyms: Option>>>, #[serde(default, deserialize_with = "deserialize_some")] pub attributes_for_faceting: Option>>, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct SettingsUpdate { pub ranking_rules: UpdateState>, pub distinct_attribute: UpdateState, pub primary_key: UpdateState, pub searchable_attributes: UpdateState>, pub displayed_attributes: UpdateState>, pub stop_words: UpdateState>, pub synonyms: UpdateState>>, pub attributes_for_faceting: UpdateState>, } #[derive(Debug, Clone, Serialize, Deserialize)] pub enum UpdateState { Update(T), Clear, Nothing, } #[derive(Debug, Clone, Serialize, Deserialize)] pub enum RankingRule { Typo, Words, Proximity, Attribute, WordsPosition, Exactness, Asc(String), Desc(String), } // Any value that is present is considered Some value, including null. fn deserialize_some<'de, T, D>(deserializer: D) -> StdResult, D::Error> where T: Deserialize<'de>, D: Deserializer<'de>, { Deserialize::deserialize(deserializer).map(Some) }