1use std::{fmt::Display, str::FromStr};
2
3use serde::{Deserialize, Serialize};
4
5use super::{POSKind, POSParseError};
6
7#[derive(Clone, Copy, PartialEq, Debug, Serialize, Deserialize)]
8pub enum Meishi {
10 SahenSetsuzoku,
12 NaiKeiyoushiGokan,
14 General,
16 QuoteStr,
18 KeiyoudoushiGokan,
20 KoyuMeishi(KoyuMeishi),
22 Kazu,
24 Setsuzokushiteki,
26 Setsubi(Setsubi),
28 Daimeishi(Daimeishi),
30 DoushiHijiritsuteki,
32 Special,
34 Hijiritsu(MeishiHijiritsu),
36 FukushiKanou,
38
39 None,
41}
42
43impl Meishi {
44 pub fn from_strs(g1: &str, g2: &str, g3: &str) -> Result<Self, POSParseError> {
45 match g1 {
46 "サ変接続" => Ok(Self::SahenSetsuzoku),
47 "ナイ形容詞語幹" => Ok(Self::NaiKeiyoushiGokan),
48 "一般" => Ok(Self::General),
49 "引用文字列" => Ok(Self::QuoteStr),
50 "形容動詞語幹" => Ok(Self::KeiyoudoushiGokan),
51 "固有名詞" => KoyuMeishi::from_strs(g2, g3).map(Self::KoyuMeishi),
52 "数" => Ok(Self::Kazu),
53 "接続詞的" => Ok(Self::Setsuzokushiteki),
54 "接尾" => Setsubi::from_str(g2).map(Self::Setsubi),
55 "代名詞" => Daimeishi::from_str(g2).map(Self::Daimeishi),
56 "動詞非自立的" => Ok(Self::DoushiHijiritsuteki),
57 "特殊" => Ok(Self::Special),
58 "非自立" => MeishiHijiritsu::from_str(g2).map(Self::Hijiritsu),
59 "副詞可能" => Ok(Self::FukushiKanou),
60 "*" => Ok(Self::None),
61
62 _ => Err(POSParseError::new(1, g1.to_string(), POSKind::Meishi)),
63 }
64 }
65}
66
67impl Display for Meishi {
68 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
69 f.write_str(match &self {
70 Self::SahenSetsuzoku => "サ変接続",
71 Self::NaiKeiyoushiGokan => "ナイ形容詞語幹",
72 Self::General => "一般",
73 Self::QuoteStr => "引用文字列",
74 Self::KeiyoudoushiGokan => "形容動詞語幹",
75 Self::KoyuMeishi(_) => "固有名詞",
76 Self::Kazu => "数",
77 Self::Setsuzokushiteki => "接続詞的",
78 Self::Setsubi(_) => "接尾",
79 Self::Daimeishi(_) => "代名詞",
80 Self::DoushiHijiritsuteki => "動詞非自立的",
81 Self::Special => "特殊",
82 Self::Hijiritsu(_) => "非自立",
83 Self::FukushiKanou => "副詞可能",
84
85 Self::None => "*",
86 })?;
87
88 match &self {
89 Self::KoyuMeishi(koyumeishi) => write!(f, ",{}", koyumeishi),
90 Self::Setsubi(setsubi) => write!(f, ",{}", setsubi),
91 Self::Daimeishi(daimeishi) => write!(f, ",{}", daimeishi),
92 Self::Hijiritsu(meishi_hijiritsu) => write!(f, ",{}", meishi_hijiritsu),
93
94 _ => f.write_str(",*,*"),
95 }?;
96
97 Ok(())
98 }
99}
100
101#[derive(Clone, Copy, PartialEq, Debug, Serialize, Deserialize)]
102pub enum KoyuMeishi {
104 General,
106 Person(Person),
108 Organization,
110 Region(Region),
112}
113
114impl KoyuMeishi {
115 pub fn from_strs(g2: &str, g3: &str) -> Result<Self, POSParseError> {
116 match g2 {
117 "一般" => Ok(Self::General),
118 "人名" => Person::from_str(g3).map(Self::Person),
119 "組織" => Ok(Self::Organization),
120 "地域" => Region::from_str(g3).map(Self::Region),
121
122 _ => Err(POSParseError::new(2, g2.to_string(), POSKind::KoyuMeishi)),
123 }
124 }
125}
126
127#[derive(Clone, Copy, PartialEq, Debug, Serialize, Deserialize)]
128pub enum Person {
130 General,
132 Sei,
134 Mei,
136}
137
138impl FromStr for Person {
139 type Err = POSParseError;
140 fn from_str(s: &str) -> Result<Self, Self::Err> {
141 match s {
142 "一般" => Ok(Self::General),
143 "姓" => Ok(Self::Sei),
144 "名" => Ok(Self::Mei),
145
146 _ => Err(POSParseError::new(3, s.to_string(), POSKind::Person)),
147 }
148 }
149}
150
151#[derive(Clone, Copy, PartialEq, Debug, Serialize, Deserialize)]
152pub enum Region {
154 General,
156 Country,
158}
159
160impl FromStr for Region {
161 type Err = POSParseError;
162 fn from_str(s: &str) -> Result<Self, Self::Err> {
163 match s {
164 "一般" => Ok(Self::General),
165 "国" => Ok(Self::Country),
166
167 _ => Err(POSParseError::new(3, s.to_string(), POSKind::Region)),
168 }
169 }
170}
171
172impl Display for KoyuMeishi {
173 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
174 f.write_str(match &self {
175 Self::General => "一般,*",
176 Self::Person(Person::General) => "人名,一般",
177 Self::Person(Person::Sei) => "人名,姓",
178 Self::Person(Person::Mei) => "人名,名",
179 Self::Organization => "組織,*",
180 Self::Region(Region::General) => "地域,一般",
181 Self::Region(Region::Country) => "地域,国",
182 })
183 }
184}
185
186#[derive(Clone, Copy, PartialEq, Debug, Serialize, Deserialize)]
187pub enum Setsubi {
189 SahenSetsuzoku,
191 General,
193 KeiyoudoushiGokan,
195 Josuushi,
197 JodoushiGokan,
199 Person,
201 Region,
203 Special,
205 FukushiKanou,
207}
208
209impl FromStr for Setsubi {
210 type Err = POSParseError;
211 fn from_str(s: &str) -> Result<Self, Self::Err> {
212 match s {
213 "サ変接続" => Ok(Self::SahenSetsuzoku),
214 "一般" => Ok(Self::General),
215 "形容動詞語幹" => Ok(Self::KeiyoudoushiGokan),
216 "助数詞" => Ok(Self::Josuushi),
217 "助動詞語幹" => Ok(Self::JodoushiGokan),
218 "人名" => Ok(Self::Person),
219 "地域" => Ok(Self::Region),
220 "特殊" => Ok(Self::Special),
221 "副詞可能" => Ok(Self::FukushiKanou),
222
223 _ => Err(POSParseError::new(2, s.to_string(), POSKind::MeishiSetsubi)),
224 }
225 }
226}
227
228impl Display for Setsubi {
229 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
230 write!(
231 f,
232 "{},*",
233 match &self {
234 Self::SahenSetsuzoku => "サ変接続",
235 Self::General => "一般",
236 Self::KeiyoudoushiGokan => "形容動詞語幹",
237 Self::Josuushi => "助数詞",
238 Self::JodoushiGokan => "助動詞語幹",
239 Self::Person => "人名",
240 Self::Region => "地域",
241 Self::Special => "特殊",
242 Self::FukushiKanou => "副詞可能",
243 },
244 )
245 }
246}
247
248#[derive(Clone, Copy, PartialEq, Debug, Serialize, Deserialize)]
249pub enum Daimeishi {
251 General,
253 Contraction,
255}
256
257impl FromStr for Daimeishi {
258 type Err = POSParseError;
259 fn from_str(s: &str) -> Result<Self, Self::Err> {
260 match s {
261 "一般" => Ok(Self::General),
262 "縮約" => Ok(Self::Contraction),
263
264 _ => Err(POSParseError::new(2, s.to_string(), POSKind::Daimeishi)),
265 }
266 }
267}
268
269impl Display for Daimeishi {
270 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
271 write!(
272 f,
273 "{},*",
274 match &self {
275 Self::General => "一般",
276 Self::Contraction => "縮約",
277 },
278 )
279 }
280}
281
282#[derive(Clone, Copy, PartialEq, Debug, Serialize, Deserialize)]
283pub enum MeishiHijiritsu {
285 General,
287 KeiyoudoushiGokan,
289 JodoushiGokan,
291 FukushiKanou,
293 None,
295}
296
297impl FromStr for MeishiHijiritsu {
298 type Err = POSParseError;
299 fn from_str(s: &str) -> Result<Self, Self::Err> {
300 match s {
301 "一般" => Ok(Self::General),
302 "形容動詞語幹" => Ok(Self::KeiyoudoushiGokan),
303 "助動詞語幹" => Ok(Self::JodoushiGokan),
304 "副詞可能" => Ok(Self::FukushiKanou),
305 "*" => Ok(Self::None),
306
307 _ => Err(POSParseError::new(
308 2,
309 s.to_string(),
310 POSKind::MeishiHijiritsu,
311 )),
312 }
313 }
314}
315
316impl Display for MeishiHijiritsu {
317 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
318 write!(
319 f,
320 "{},*",
321 match &self {
322 Self::General => "一般",
323 Self::KeiyoudoushiGokan => "形容動詞語幹",
324 Self::JodoushiGokan => "助動詞語幹",
325 Self::FukushiKanou => "副詞可能",
326 Self::None => "*",
327 },
328 )
329 }
330}