use tablo_core::dom::import;
use super::dom::{attr_value, tags_where};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum ImportRefusal {
NoFile,
Encoding,
Unterminated,
NoHeader,
NoRows,
TooManyRows,
TooManyCells,
UnknownColumn,
AmbiguousColumn,
RepeatedColumn,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ImportError {
pub row: usize,
pub key: Option<String>,
}
pub fn import_refusal(html: &str) -> Option<ImportRefusal> {
let (_, attrs, _) = tags_where(html, |_, attrs| {
attr_value(attrs, "data-import-refusal").is_some()
})
.into_iter()
.next()?;
Some(match attr_value(&attrs, "data-import-refusal").as_deref() {
Some(import::NO_FILE) => ImportRefusal::NoFile,
Some(import::ENCODING) => ImportRefusal::Encoding,
Some(import::UNTERMINATED) => ImportRefusal::Unterminated,
Some(import::NO_HEADER) => ImportRefusal::NoHeader,
Some(import::NO_ROWS) => ImportRefusal::NoRows,
Some(import::TOO_MANY_ROWS) => ImportRefusal::TooManyRows,
Some(import::TOO_MANY_CELLS) => ImportRefusal::TooManyCells,
Some(import::UNKNOWN_COLUMN) => ImportRefusal::UnknownColumn,
Some(import::AMBIGUOUS_COLUMN) => ImportRefusal::AmbiguousColumn,
Some(import::REPEATED_COLUMN) => ImportRefusal::RepeatedColumn,
other => panic!("the import alert names no known refusal: {other:?}"),
})
}
pub fn import_errors(html: &str) -> Vec<ImportError> {
tags_where(html, |_, attrs| {
attr_value(attrs, "data-import-error").is_some()
})
.into_iter()
.map(|(_, attrs, _)| ImportError {
row: attr_value(&attrs, "data-import-error")
.and_then(|row| row.parse().ok())
.expect("an import error names its row"),
key: attr_value(&attrs, "data-import-key").filter(|key| !key.is_empty()),
})
.collect()
}
pub fn import_columns(html: &str) -> Vec<String> {
tags_where(html, |_, attrs| {
attr_value(attrs, "data-import-column").is_some()
})
.into_iter()
.filter_map(|(_, attrs, _)| attr_value(&attrs, "data-import-column"))
.collect()
}