jpreprocess_core/
cform.rs

1use serde::{Deserialize, Serialize};
2use std::{fmt::Display, str::FromStr};
3
4use crate::JPreprocessError;
5
6#[derive(Clone, Copy, PartialEq, Debug, Serialize, Deserialize, Default)]
7/// 活用形
8pub enum CForm {
9    /// ガル接続
10    ConjunctionGaru,
11    /// 音便基本形
12    BasicEuphony,
13    /// 仮定形
14    Conditional,
15    /// 仮定縮約1
16    ConditionalContraction1,
17    /// 仮定縮約2
18    ConditionalContraction2,
19    /// 基本形
20    Basic,
21    /// 基本形-促音便
22    BasicDoubledConsonant,
23    /// 現代基本形
24    BasicModern,
25    /// 体言接続
26    TaigenConjunction,
27    /// 体言接続特殊
28    TaigenConjunctionSpecial,
29    /// 体言接続特殊2
30    TaigenConjunctionSpecial2,
31    /// 文語基本形
32    BasicOld,
33    /// 未然ウ接続
34    MizenConjunctionU,
35    /// 未然ヌ接続
36    MizenConjunctionNu,
37    /// 未然レル接続
38    MizenConjunctionReru,
39    /// 未然形
40    Mizen,
41    /// 未然特殊
42    MizenSpecial,
43    /// 命令e
44    ImperativeE,
45    /// 命令i
46    ImperativeI,
47    /// 命令ro
48    ImperativeRo,
49    /// 命令yo
50    ImperativeYo,
51    /// 連用ゴザイ接続
52    RenyouConjunctionGozai,
53    /// 連用タ接続
54    RenyouConjunctionTa,
55    /// 連用テ接続
56    RenyouConjunctionTe,
57    /// 連用デ接続
58    RenyouConjunctionDe,
59    /// 連用ニ接続
60    RenyouConjunctionNi,
61    /// 連用形
62    Renyou,
63
64    /// \*
65    #[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}