1pub type S = Box<str>;
2
3pub type V<T> = Box<[T]>;
4
5#[derive(Clone, Debug, PartialEq, serde::Deserialize)]
6pub struct File {
7 #[serde(rename = "Lexicon")]
8 pub lexicons: V<Lexicon>,
9}
10
11#[derive(Clone, Debug, PartialEq, serde::Deserialize)]
12pub struct Lexicon {
13 pub id: S,
14 pub label: S,
15 pub language: S,
16 pub email: S,
17 pub license: S,
18 pub version: S,
19 pub url: S,
20
21 #[serde(rename = "LexicalEntry")]
22 pub lexical_entries: V<LexicalEntry>,
23
24 #[serde(rename = "Synset")]
25 pub synsets: V<Synset>,
26}
27
28#[derive(Clone, Debug, PartialEq, serde::Deserialize)]
29pub struct LexicalEntry {
30 pub id: S,
31 #[serde(rename = "Lemma")]
32 pub lemma: Lemma,
33 #[serde(rename = "Form", default)]
34 pub forms: V<Form>,
35 #[serde(rename = "Sense")]
36 pub senses: V<Sense>,
37}
38
39#[derive(Clone, Debug, PartialEq, serde::Deserialize)]
40pub struct Lemma {
41 #[serde(rename = "writtenForm")]
42 pub written_form: S,
43 #[serde(rename = "partOfSpeech")]
44 pub part_of_speech: PartOfSpeech,
45}
46
47#[derive(Clone, Debug, PartialEq, serde::Deserialize)]
48pub struct Form {
49 #[serde(rename = "writtenForm")]
50 pub written_form: S,
51}
52
53#[derive(Clone, Debug, PartialEq, serde::Deserialize)]
54pub struct Sense {
55 pub id: S,
56 pub synset: S,
57 #[serde(rename = "SenseRelation", default)]
58 pub relations: V<SenseRelation>,
59}
60
61#[derive(Clone, Debug, PartialEq, serde::Deserialize)]
62pub struct SenseRelation {
63 #[serde(rename = "relType")]
64 pub rel_type: RelationType,
65 pub target: S,
66}
67
68#[derive(Clone, Debug, PartialEq, serde::Deserialize)]
69pub struct Synset {
70 pub id: S,
71 #[serde(rename = "partOfSpeech")]
72 pub part_of_speech: PartOfSpeech,
73 #[serde(rename = "Definition")]
74 pub definitions: V<S>,
75 #[serde(rename = "Example", default)]
76 pub examples: V<S>,
77 #[serde(rename = "SynsetRelation", default)]
78 pub relations: V<SynsetRelation>,
79}
80
81#[derive(Clone, Debug, PartialEq, serde::Deserialize)]
82pub struct SynsetRelation {
83 #[serde(rename = "relType")]
84 pub rel_type: RelationType,
85 pub target: S,
86}
87
88#[derive(Clone, Debug, PartialEq, serde::Deserialize)]
89pub enum PartOfSpeech {
90 #[serde(rename = "a")]
91 Adjective,
92 #[serde(rename = "s")]
93 AdjectiveSatellite,
94 #[serde(rename = "r")]
95 Adverb,
96 #[serde(rename = "n")]
97 Noun,
98 #[serde(rename = "v")]
99 Verb,
100}
101
102#[derive(Clone, Debug, PartialEq, serde::Deserialize)]
103#[serde(rename_all = "snake_case")]
104pub enum RelationType {
105 Also,
106 Antonym,
107 Attribute,
108 Causes,
109 Derivation,
110 DomainRegion,
111 DomainTopic,
112 Entails,
113 Exemplifies,
114 HasDomainRegion,
115 HasDomainTopic,
116 HoloMember,
117 HoloPart,
118 HoloSubstance,
119 Hypernym,
120 Hyponym,
121 InstanceHypernym,
122 InstanceHyponym,
123 IsCausedBy,
124 IsEntailedBy,
125 IsExemplifiedBy,
126 MeroMember,
127 MeroPart,
128 MeroSubstance,
129 Participle,
130 Pertainym,
131 Similar,
132}
133
134impl File {
135 pub fn open(path: impl AsRef<std::path::Path>) -> Result<Self, quick_xml::de::DeError> {
136 use serde::de::Error;
137 let file = std::fs::File::open(path).map_err(quick_xml::de::DeError::custom)?;
138 quick_xml::de::from_reader(std::io::BufReader::new(file))
139 }
140}