use crate::element::parser::ElementParser;
use crate::element::sub::SubElement;
use crate::element::sub::definition::SubElementDefinition;
use crate::element::{Element, ElementDefWrapper};
use crate::error::WebDynproError;
#[derive(Debug)]
pub enum SapTableCellWrapper<'a> {
Normal(SapTableNormalCell<'a>),
Header(SapTableHeaderCell<'a>),
Hierarchical(SapTableHierarchicalCell<'a>),
Matrix(SapTableMatrixCell<'a>),
Selection(SapTableSelectionCell<'a>),
}
impl<'a> SapTableCellWrapper<'a> {
pub fn from_ref(
table_def: <SapTable<'a> as Element<'a>>::Def,
elem_ref: scraper::ElementRef<'a>,
) -> Option<SapTableCellWrapper<'a>> {
let subct_value = elem_ref.value();
match subct_value.attr("subct") {
Some(SapTableNormalCell::SUBCONTROL_ID) => Some(
SapTableNormalCell::from_ref(
&SapTableNormalCellDef::new_dynamic(table_def, subct_value.id()?.to_owned()),
elem_ref,
)
.ok()?
.wrap(),
),
Some(SapTableHeaderCell::SUBCONTROL_ID) => Some(
SapTableHeaderCell::from_ref(
&SapTableHeaderCellDef::new_dynamic(table_def, subct_value.id()?.to_owned()),
elem_ref,
)
.ok()?
.wrap(),
),
Some(SapTableHierarchicalCell::SUBCONTROL_ID) => Some(
SapTableHierarchicalCell::from_ref(
&SapTableHierarchicalCellDef::new_dynamic(
table_def,
subct_value.id()?.to_owned(),
),
elem_ref,
)
.ok()?
.wrap(),
),
Some(SapTableMatrixCell::SUBCONTROL_ID) => Some(
SapTableMatrixCell::from_ref(
&SapTableMatrixCellDef::new_dynamic(table_def, subct_value.id()?.to_owned()),
elem_ref,
)
.ok()?
.wrap(),
),
Some(SapTableSelectionCell::SUBCONTROL_ID) => Some(
SapTableSelectionCell::from_ref(
&SapTableSelectionCellDef::new_dynamic(table_def, subct_value.id()?.to_owned()),
elem_ref,
)
.ok()?
.wrap(),
),
_ => None,
}
}
pub fn from_def(
wrapper: &SapTableCellDefWrapper,
parser: &'a ElementParser,
) -> Result<SapTableCellWrapper<'a>, WebDynproError> {
Ok(match wrapper {
SapTableCellDefWrapper::Normal(def) => {
SapTableCellWrapper::Normal(parser.subelement_from_def(def)?)
}
SapTableCellDefWrapper::Header(def) => {
SapTableCellWrapper::Header(parser.subelement_from_def(def)?)
}
SapTableCellDefWrapper::Hierarchical(def) => {
SapTableCellWrapper::Hierarchical(parser.subelement_from_def(def)?)
}
SapTableCellDefWrapper::Matrix(def) => {
SapTableCellWrapper::Matrix(parser.subelement_from_def(def)?)
}
SapTableCellDefWrapper::Selection(def) => {
SapTableCellWrapper::Selection(parser.subelement_from_def(def)?)
}
})
}
pub fn id(&self) -> &str {
match self {
SapTableCellWrapper::Normal(cell) => cell.id(),
SapTableCellWrapper::Header(cell) => cell.id(),
SapTableCellWrapper::Hierarchical(cell) => cell.id(),
SapTableCellWrapper::Matrix(cell) => cell.id(),
SapTableCellWrapper::Selection(cell) => cell.id(),
}
}
}
#[derive(Clone, Debug)]
pub enum SapTableCellDefWrapper {
Normal(SapTableNormalCellDef),
Header(SapTableHeaderCellDef),
Hierarchical(SapTableHierarchicalCellDef),
Matrix(SapTableMatrixCellDef),
Selection(SapTableSelectionCellDef),
}
impl SapTableCellDefWrapper {
pub fn from_ref(
table_def: SapTableDef,
elem_ref: scraper::ElementRef<'_>,
) -> Option<SapTableCellDefWrapper> {
let subct_value = elem_ref.value();
match subct_value.attr("subct") {
Some(SapTableNormalCell::SUBCONTROL_ID) => Some(SapTableCellDefWrapper::Normal(
SapTableNormalCellDef::new_dynamic(table_def, subct_value.id()?.to_owned()),
)),
Some(SapTableHeaderCell::SUBCONTROL_ID) => Some(SapTableCellDefWrapper::Header(
SapTableHeaderCellDef::new_dynamic(table_def, subct_value.id()?.to_owned()),
)),
Some(SapTableHierarchicalCell::SUBCONTROL_ID) => Some(
SapTableCellDefWrapper::Hierarchical(SapTableHierarchicalCellDef::new_dynamic(
table_def,
subct_value.id()?.to_owned(),
)),
),
Some(SapTableMatrixCell::SUBCONTROL_ID) => Some(SapTableCellDefWrapper::Matrix(
SapTableMatrixCellDef::new_dynamic(table_def, subct_value.id()?.to_owned()),
)),
Some(SapTableSelectionCell::SUBCONTROL_ID) => Some(SapTableCellDefWrapper::Selection(
SapTableSelectionCellDef::new_dynamic(table_def, subct_value.id()?.to_owned()),
)),
_ => None,
}
}
pub fn with_parser<'body>(
&self,
parser: &'body ElementParser,
) -> Result<SapTableCellWrapper<'body>, WebDynproError> {
match self {
Self::Normal(def) => Ok(parser.subelement_from_def(def)?.wrap()),
Self::Header(def) => Ok(parser.subelement_from_def(def)?.wrap()),
Self::Hierarchical(def) => Ok(parser.subelement_from_def(def)?.wrap()),
Self::Matrix(def) => Ok(parser.subelement_from_def(def)?.wrap()),
Self::Selection(def) => Ok(parser.subelement_from_def(def)?.wrap()),
}
}
}
pub trait SapTableCell<'a> {
fn content(&self) -> Option<ElementDefWrapper<'a>>;
}
impl<'a> SapTableCell<'a> for SapTableCellWrapper<'a> {
fn content(&self) -> Option<ElementDefWrapper<'a>> {
match self {
SapTableCellWrapper::Normal(elem) => elem.content(),
SapTableCellWrapper::Header(elem) => elem.content(),
SapTableCellWrapper::Hierarchical(elem) => elem.content(),
SapTableCellWrapper::Matrix(elem) => elem.content(),
SapTableCellWrapper::Selection(elem) => elem.content(),
}
}
}
mod header_cell;
mod hierarchical_cell;
mod matrix_cell;
mod normal_cell;
mod selection_cell;
pub use self::header_cell::{SapTableHeaderCell, SapTableHeaderCellDef, SapTableHeaderCellLSData};
pub use self::hierarchical_cell::{
SapTableHierarchicalCell, SapTableHierarchicalCellDef, SapTableHierarchicalCellLSData,
};
pub use self::matrix_cell::{SapTableMatrixCell, SapTableMatrixCellDef, SapTableMatrixCellLSData};
pub use self::normal_cell::{SapTableNormalCell, SapTableNormalCellDef, SapTableNormalCellLSData};
pub use self::selection_cell::{
SapTableSelectionCell, SapTableSelectionCellDef, SapTableSelectionCellLSData,
};
use super::{SapTable, SapTableDef};