1use serde::{Deserialize, Serialize};
2use std::{fmt::Display, str::FromStr};
3
4use crate::JPreprocessError;
5
6#[derive(Clone, Copy, PartialEq, Debug, Serialize, Deserialize, Default)]
7pub enum CForm {
9 ConjunctionGaru,
11 BasicEuphony,
13 Conditional,
15 ConditionalContraction1,
17 ConditionalContraction2,
19 Basic,
21 BasicDoubledConsonant,
23 BasicModern,
25 TaigenConjunction,
27 TaigenConjunctionSpecial,
29 TaigenConjunctionSpecial2,
31 BasicOld,
33 MizenConjunctionU,
35 MizenConjunctionNu,
37 MizenConjunctionReru,
39 Mizen,
41 MizenSpecial,
43 ImperativeE,
45 ImperativeI,
47 ImperativeRo,
49 ImperativeYo,
51 RenyouConjunctionGozai,
53 RenyouConjunctionTa,
55 RenyouConjunctionTe,
57 RenyouConjunctionDe,
59 RenyouConjunctionNi,
61 Renyou,
63
64 #[default]
66 None,
67}
68
69impl CForm {
70 pub fn is_renyou(&self) -> bool {
71 matches!(
72 self,
73 Self::RenyouConjunctionGozai
74 | Self::RenyouConjunctionTa
75 | Self::RenyouConjunctionTe
76 | Self::RenyouConjunctionDe
77 | Self::RenyouConjunctionNi
78 | Self::Renyou
79 )
80 }
81}
82
83impl FromStr for CForm {
84 type Err = JPreprocessError;
85 fn from_str(s: &str) -> Result<Self, Self::Err> {
86 match s {
87 "ガル接続" => Ok(Self::ConjunctionGaru),
88 "音便基本形" => Ok(Self::BasicEuphony),
89 "仮定形" => Ok(Self::Conditional),
90 "仮定縮約1" => Ok(Self::ConditionalContraction1),
91 "仮定縮約2" => Ok(Self::ConditionalContraction2),
92 "基本形" => Ok(Self::Basic),
93 "基本形-促音便" => Ok(Self::BasicDoubledConsonant),
94 "現代基本形" => Ok(Self::BasicModern),
95 "体言接続" => Ok(Self::TaigenConjunction),
96 "体言接続特殊" => Ok(Self::TaigenConjunctionSpecial),
97 "体言接続特殊2" => Ok(Self::TaigenConjunctionSpecial2),
98 "文語基本形" => Ok(Self::BasicOld),
99 "未然ウ接続" => Ok(Self::MizenConjunctionU),
100 "未然ヌ接続" => Ok(Self::MizenConjunctionNu),
101 "未然レル接続" => Ok(Self::MizenConjunctionReru),
102 "未然形" => Ok(Self::Mizen),
103 "未然特殊" => Ok(Self::MizenSpecial),
104 "命令e" => Ok(Self::ImperativeE),
105 "命令i" => Ok(Self::ImperativeI),
106 "命令ro" => Ok(Self::ImperativeRo),
107 "命令yo" => Ok(Self::ImperativeYo),
108 "連用ゴザイ接続" => Ok(Self::RenyouConjunctionGozai),
109 "連用タ接続" => Ok(Self::RenyouConjunctionTa),
110 "連用テ接続" => Ok(Self::RenyouConjunctionTe),
111 "連用デ接続" => Ok(Self::RenyouConjunctionDe),
112 "連用ニ接続" => Ok(Self::RenyouConjunctionNi),
113 "連用形" => Ok(Self::Renyou),
114
115 "*" => Ok(Self::None),
116
117 _ => Err(JPreprocessError::CFormParseError),
118 }
119 }
120}
121
122impl Display for CForm {
123 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
124 f.write_str(match &self {
125 Self::ConjunctionGaru => "ガル接続",
126 Self::BasicEuphony => "音便基本形",
127 Self::Conditional => "仮定形",
128 Self::ConditionalContraction1 => "仮定縮約1",
129 Self::ConditionalContraction2 => "仮定縮約2",
130 Self::Basic => "基本形",
131 Self::BasicDoubledConsonant => "基本形-促音便",
132 Self::BasicModern => "現代基本形",
133 Self::TaigenConjunction => "体言接続",
134 Self::TaigenConjunctionSpecial => "体言接続特殊",
135 Self::TaigenConjunctionSpecial2 => "体言接続特殊2",
136 Self::BasicOld => "文語基本形",
137 Self::MizenConjunctionU => "未然ウ接続",
138 Self::MizenConjunctionNu => "未然ヌ接続",
139 Self::MizenConjunctionReru => "未然レル接続",
140 Self::Mizen => "未然形",
141 Self::MizenSpecial => "未然特殊",
142 Self::ImperativeE => "命令e",
143 Self::ImperativeI => "命令i",
144 Self::ImperativeRo => "命令ro",
145 Self::ImperativeYo => "命令yo",
146 Self::RenyouConjunctionGozai => "連用ゴザイ接続",
147 Self::RenyouConjunctionTa => "連用タ接続",
148 Self::RenyouConjunctionTe => "連用テ接続",
149 Self::RenyouConjunctionDe => "連用デ接続",
150 Self::RenyouConjunctionNi => "連用ニ接続",
151 Self::Renyou => "連用形",
152
153 Self::None => "*",
154 })
155 }
156}