use super::{ListItem, RubyText, Tab, TableCell, TableRow};
use crate::parsing::ParseErrorKind;
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub enum PartialElement<'t> {
ListItem(ListItem<'t>),
TableRow(TableRow<'t>),
TableCell(TableCell<'t>),
Tab(Tab<'t>),
RubyText(RubyText<'t>),
}
impl PartialElement<'_> {
pub fn name(&self) -> &'static str {
match self {
PartialElement::ListItem(_) => "ListItem",
PartialElement::TableRow(_) => "TableRow",
PartialElement::TableCell(_) => "TableCell",
PartialElement::Tab(_) => "Tab",
PartialElement::RubyText(_) => "RubyText",
}
}
#[inline]
pub fn parse_error_kind(&self) -> ParseErrorKind {
match self {
PartialElement::ListItem(_) => ParseErrorKind::ListItemOutsideList,
PartialElement::TableRow(_) => ParseErrorKind::TableRowOutsideTable,
PartialElement::TableCell(_) => ParseErrorKind::TableCellOutsideTable,
PartialElement::Tab(_) => ParseErrorKind::TabOutsideTabView,
PartialElement::RubyText(_) => ParseErrorKind::RubyTextOutsideRuby,
}
}
pub fn to_owned(&self) -> PartialElement<'static> {
match self {
PartialElement::ListItem(list_item) => {
PartialElement::ListItem(list_item.to_owned())
}
PartialElement::TableRow(table_row) => {
PartialElement::TableRow(table_row.to_owned())
}
PartialElement::TableCell(table_cell) => {
PartialElement::TableCell(table_cell.to_owned())
}
PartialElement::Tab(tab) => PartialElement::Tab(tab.to_owned()),
PartialElement::RubyText(text) => PartialElement::RubyText(text.to_owned()),
}
}
}
#[derive(Debug, Default, Copy, Clone, PartialEq, Eq, Hash)]
pub enum AcceptsPartial {
#[default]
None,
ListItem,
TableRow,
TableCell,
Tab,
Ruby,
}
impl AcceptsPartial {
pub fn matches(self, partial: &PartialElement) -> bool {
matches!(
(self, partial),
(AcceptsPartial::ListItem, PartialElement::ListItem(_))
| (AcceptsPartial::TableRow, PartialElement::TableRow(_))
| (AcceptsPartial::TableCell, PartialElement::TableCell(_))
| (AcceptsPartial::Tab, PartialElement::Tab(_))
| (AcceptsPartial::Ruby, PartialElement::RubyText(_))
)
}
}