use crate::excel::xlsx_writer::CellData;
use crate::excel::xlsx_writer::RowData;
pub fn classify_cell(value: &str) -> CellData {
if let Ok(num) = value.parse::<f64>() {
CellData::Number(num)
} else if !value.is_empty() {
CellData::String(value.to_string())
} else {
CellData::Empty
}
}
pub fn add_cell_to_row(row: &mut RowData, value: &str) {
let cell = classify_cell(value);
match cell {
CellData::Number(n) => row.add_number(n),
CellData::String(s) => row.add_string(&s),
CellData::Empty => row.add_empty(),
CellData::Formula(f) => row.add_formula(&f),
}
}
pub fn add_cells_to_row(row: &mut RowData, values: &[String]) {
for value in values {
add_cell_to_row(row, value);
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_classify_number() {
let cell = classify_cell("123.45");
assert!(matches!(cell, CellData::Number(n) if (n - 123.45).abs() < f64::EPSILON));
}
#[test]
fn test_classify_integer() {
let cell = classify_cell("42");
assert!(matches!(cell, CellData::Number(42.0)));
}
#[test]
fn test_classify_negative_number() {
let cell = classify_cell("-123.45");
assert!(matches!(cell, CellData::Number(n) if (n + 123.45).abs() < f64::EPSILON));
}
#[test]
fn test_classify_string() {
let cell = classify_cell("hello");
assert!(matches!(cell, CellData::String(s) if s == "hello"));
}
#[test]
fn test_classify_empty() {
let cell = classify_cell("");
assert!(matches!(cell, CellData::Empty));
}
#[test]
fn test_classify_whitespace() {
let cell = classify_cell(" ");
assert!(matches!(cell, CellData::String(_)));
}
#[test]
fn test_classify_invalid_number() {
let cell = classify_cell("not a number");
assert!(matches!(cell, CellData::String(_)));
}
#[test]
fn test_add_cell_to_row() {
let mut row = RowData::new();
add_cell_to_row(&mut row, "123");
add_cell_to_row(&mut row, "hello");
add_cell_to_row(&mut row, "");
assert_eq!(row.cells.len(), 3);
assert!(matches!(row.cells[0], CellData::Number(123.0)));
assert!(matches!(&row.cells[1], CellData::String(s) if s == "hello"));
assert!(matches!(row.cells[2], CellData::Empty));
}
#[test]
fn test_add_cells_to_row() {
let mut row = RowData::new();
let values = vec!["123".to_string(), "hello".to_string(), "".to_string()];
add_cells_to_row(&mut row, &values);
assert_eq!(row.cells.len(), 3);
}
}