1#![forbid(unsafe_code)]
21
22use miette::Diagnostic;
23use thiserror::Error;
24
25pub mod accent;
26pub mod alloc;
27pub mod borrowed;
28mod extension;
29pub mod node_kind;
30
31pub use extension::ContainerKind;
32pub use node_kind::NodeKind;
33
34pub use aozora_spec::Span;
39
40#[derive(Debug, Clone, Copy, PartialEq, Eq)]
45#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
46pub struct Container {
47 pub kind: ContainerKind,
48}
49
50#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
51#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
52#[non_exhaustive]
53pub enum BoutenKind {
54 Goma,
56 WhiteSesame,
58 Circle,
60 WhiteCircle,
62 DoubleCircle,
64 Janome,
66 Cross,
68 WhiteTriangle,
70 WavyLine,
72 UnderLine,
74 DoubleUnderLine,
76}
77
78#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
80#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
81#[non_exhaustive]
82pub enum BoutenPosition {
83 #[default]
84 Right,
85 Left,
86}
87
88#[derive(Debug, Clone, Copy, PartialEq, Eq)]
89#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
90pub struct Indent {
91 pub amount: u8,
92}
93
94#[derive(Debug, Clone, Copy, PartialEq, Eq)]
95#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
96pub struct AlignEnd {
97 pub offset: u8,
99}
100
101#[derive(Debug, Clone, Copy, PartialEq, Eq)]
102#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
103pub struct Keigakomi;
104
105#[derive(Debug, Clone, Copy, PartialEq, Eq)]
106#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
107#[non_exhaustive]
108pub enum SectionKind {
109 Choho,
111 Dan,
113 Spread,
115}
116
117#[derive(Debug, Clone, Copy, PartialEq, Eq)]
118#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
119#[non_exhaustive]
120pub enum AozoraHeadingKind {
121 Window,
123 Sub,
125}
126
127#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
128#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
129#[non_exhaustive]
130pub enum AnnotationKind {
131 Unknown,
133 AsIs,
135 TextualNote,
137 InvalidRubySpan,
139 WarichuOpen,
141 WarichuClose,
143}
144
145#[derive(Debug, Error, Diagnostic)]
147#[non_exhaustive]
148pub enum SyntaxError {
149 #[error("未知のノード種別です: {kind}")]
150 #[diagnostic(code(aozora::syntax::unknown_kind))]
151 UnknownKind { kind: Box<str> },
152}
153
154#[cfg(test)]
155mod tests {
156 use super::*;
157
158 #[test]
159 fn empty_span_is_empty_and_zero_length() {
160 let s = Span::new(42, 42);
161 assert!(s.is_empty());
162 assert_eq!(s.len(), 0);
163 }
164
165 #[test]
166 fn span_slices_source_buffer() {
167 let source = "hello world";
168 let s = Span::new(6, 11);
169 assert_eq!(s.slice(source), "world");
170 }
171
172 #[test]
173 fn bouten_position_defaults_to_right() {
174 assert_eq!(BoutenPosition::default(), BoutenPosition::Right);
175 }
176}