#![forbid(unsafe_code)]
use miette::Diagnostic;
use thiserror::Error;
pub mod accent;
pub mod alloc;
pub mod borrowed;
mod extension;
pub mod node_kind;
pub use extension::ContainerKind;
pub use node_kind::NodeKind;
pub use aozora_spec::Span;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Container {
pub kind: ContainerKind,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[non_exhaustive]
pub enum BoutenKind {
Goma,
WhiteSesame,
Circle,
WhiteCircle,
DoubleCircle,
Janome,
Cross,
WhiteTriangle,
WavyLine,
UnderLine,
DoubleUnderLine,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[non_exhaustive]
pub enum BoutenPosition {
#[default]
Right,
Left,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Indent {
pub amount: u8,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct AlignEnd {
pub offset: u8,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Keigakomi;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[non_exhaustive]
pub enum SectionKind {
Choho,
Dan,
Spread,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[non_exhaustive]
pub enum AozoraHeadingKind {
Window,
Sub,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[non_exhaustive]
pub enum AnnotationKind {
Unknown,
AsIs,
TextualNote,
InvalidRubySpan,
WarichuOpen,
WarichuClose,
}
#[derive(Debug, Error, Diagnostic)]
#[non_exhaustive]
pub enum SyntaxError {
#[error("未知のノード種別です: {kind}")]
#[diagnostic(code(aozora::syntax::unknown_kind))]
UnknownKind { kind: Box<str> },
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn empty_span_is_empty_and_zero_length() {
let s = Span::new(42, 42);
assert!(s.is_empty());
assert_eq!(s.len(), 0);
}
#[test]
fn span_slices_source_buffer() {
let source = "hello world";
let s = Span::new(6, 11);
assert_eq!(s.slice(source), "world");
}
#[test]
fn bouten_position_defaults_to_right() {
assert_eq!(BoutenPosition::default(), BoutenPosition::Right);
}
}