pub mod translate;
use imbl::HashMap;
use logisheets_base::SheetId;
use logisheets_workbook::prelude::{CtDataValidation, CtDataValidations, StDataValidationType};
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ListValidation {
Inline(Vec<String>),
Reference(String),
}
pub fn list_validation(dv: &CtDataValidation) -> Option<ListValidation> {
if !matches!(dv.ty, StDataValidationType::List) {
return None;
}
let src = dv.formula1.as_ref()?.value.trim().to_string();
if src.len() >= 2 && src.starts_with('"') && src.ends_with('"') {
let inner = &src[1..src.len() - 1];
let items = inner
.split(',')
.map(|s| s.trim().replace("\"\"", "\""))
.collect();
Some(ListValidation::Inline(items))
} else {
Some(ListValidation::Reference(src))
}
}
#[derive(Debug, Clone, Default)]
pub struct DataValidationManager {
pub validations: HashMap<SheetId, CtDataValidations>,
}
impl DataValidationManager {
pub fn new() -> Self {
Self::default()
}
pub fn set_sheet(&mut self, sheet_id: SheetId, validations: CtDataValidations) {
self.validations.insert(sheet_id, validations);
}
pub fn get_sheet(&self, sheet_id: SheetId) -> Option<&CtDataValidations> {
self.validations.get(&sheet_id)
}
pub fn is_empty(&self) -> bool {
self.validations.is_empty()
}
}
pub use crate::sqref::{SqrefRange, parse_sqref};