odict/format/json/
etymology.rs

1use std::collections::HashMap;
2
3use serde::Serialize;
4
5use crate::{Etymology, PartOfSpeech};
6
7use super::{ordered_map, SenseJSON};
8
9#[derive(Serialize)]
10pub struct EtymologyJSON {
11    #[serde(skip_serializing_if = "Option::is_none")]
12    pub id: Option<String>,
13
14    #[serde(skip_serializing_if = "Option::is_none")]
15    pub pronunciation: Option<String>,
16
17    #[serde(skip_serializing_if = "Option::is_none")]
18    pub description: Option<String>,
19
20    #[serde(
21        serialize_with = "ordered_map",
22        skip_serializing_if = "HashMap::is_empty"
23    )]
24    pub senses: HashMap<PartOfSpeech, SenseJSON>,
25}
26
27impl From<Etymology> for EtymologyJSON {
28    fn from(entry: Etymology) -> Self {
29        let Etymology {
30            id,
31            pronunciation,
32            description,
33            senses,
34        } = entry;
35
36        Self {
37            id,
38            pronunciation,
39            description,
40            senses: senses
41                .into_iter()
42                .map(|(k, v)| (k, SenseJSON::from(v)))
43                .collect(),
44        }
45    }
46}