use crate::com::dispatch::Dispatch;
use crate::com::variant::{CellValue, Variant};
use crate::error::OaResult;
pub fn range_dispatch(wb: &mut Dispatch, range_ref: &str) -> OaResult<Dispatch> {
let (sheet, addr) = match range_ref.find('!') {
Some(p) => (&range_ref[..p], &range_ref[p + 1..]),
None => ("Tables", range_ref),
};
let mut sheets = Dispatch::new(wb.get("Worksheets")?.as_dispatch()?);
let mut ws = Dispatch::new(sheets.call("Item", &[Variant::from(sheet)])?.as_dispatch()?);
Ok(Dispatch::new(ws.call("Range", &[Variant::from(addr)])?.as_dispatch()?))
}
pub fn read_range_numbers(range: &mut Dispatch) -> OaResult<Vec<Option<f64>>> {
range.get("Value2")?.as_flat_opt_f64_vec()
}
pub fn read_range_texts(range: &mut Dispatch) -> OaResult<Vec<Option<String>>> {
let cells = range.get("Value2")?.as_flat_cell_vec()?;
let mut out = Vec::with_capacity(cells.len());
let mut cells_coll: Option<Dispatch> = None;
for (i, cell) in cells.into_iter().enumerate() {
out.push(match cell {
CellValue::Str(s) => if s.is_empty() { None } else { Some(s) },
CellValue::Empty => None,
CellValue::F64(_) | CellValue::I32(_) => {
if cells_coll.is_none() {
cells_coll = Some(Dispatch::new(range.get("Cells")?.as_dispatch()?));
}
let coll = cells_coll.as_mut().expect("initialised above");
let text = Dispatch::new(coll.call("Item", &[Variant::from((i + 1) as i32)])?.as_dispatch()?)
.get("Text")?
.as_string()?;
if text.is_empty() { None } else { Some(text) }
}
});
}
Ok(out)
}