Skip to main content

hoist_core/resources/
synonym_map.rs

1//! Synonym Map resource definition
2
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6use super::traits::{Resource, ResourceKind};
7
8/// Azure AI Search Synonym Map definition
9#[derive(Debug, Clone, Serialize, Deserialize)]
10#[serde(rename_all = "camelCase")]
11pub struct SynonymMap {
12    pub name: String,
13    pub format: String,
14    pub synonyms: String,
15    #[serde(skip_serializing_if = "Option::is_none")]
16    pub encryption_key: Option<Value>,
17    #[serde(flatten)]
18    pub extra: std::collections::HashMap<String, Value>,
19}
20
21impl Resource for SynonymMap {
22    fn kind() -> ResourceKind {
23        ResourceKind::SynonymMap
24    }
25
26    fn name(&self) -> &str {
27        &self.name
28    }
29}
30
31#[cfg(test)]
32mod tests {
33    use super::*;
34    use serde_json::json;
35
36    #[test]
37    fn test_synonym_map_kind() {
38        assert_eq!(SynonymMap::kind(), ResourceKind::SynonymMap);
39    }
40
41    #[test]
42    fn test_synonym_map_default_volatile_fields() {
43        let fields = SynonymMap::volatile_fields();
44        assert_eq!(fields, &["@odata.etag", "@odata.context"]);
45    }
46
47    #[test]
48    fn test_synonym_map_identity_key() {
49        assert_eq!(SynonymMap::identity_key(), "name");
50    }
51
52    #[test]
53    fn test_synonym_map_deserialize() {
54        let val = json!({
55            "name": "my-synonyms",
56            "format": "solr",
57            "synonyms": "USA, United States, United States of America\nWashington, Wash. => WA"
58        });
59        let sm: SynonymMap = serde_json::from_value(val).unwrap();
60        assert_eq!(sm.name, "my-synonyms");
61        assert_eq!(sm.format, "solr");
62        assert!(sm.synonyms.contains("USA"));
63        assert!(sm.encryption_key.is_none());
64    }
65
66    #[test]
67    fn test_synonym_map_roundtrip() {
68        let val = json!({
69            "name": "roundtrip-map",
70            "format": "solr",
71            "synonyms": "fast, quick, speedy"
72        });
73        let sm: SynonymMap = serde_json::from_value(val).unwrap();
74        let serialized = serde_json::to_string(&sm).unwrap();
75        let deserialized: SynonymMap = serde_json::from_str(&serialized).unwrap();
76        assert_eq!(deserialized.name, "roundtrip-map");
77        assert_eq!(deserialized.format, "solr");
78        assert_eq!(deserialized.synonyms, "fast, quick, speedy");
79    }
80}