formualizer-workbook 0.5.4

Ergonomic workbook API over the Formualizer engine (sheets, loaders, staging, undo/redo)
Documentation
#[cfg(feature = "json")]
mod json_stream {
    use formualizer_common::RangeAddress;
    use formualizer_eval::engine::ingest::EngineLoadStream;
    use formualizer_eval::engine::named_range::NamedDefinition;
    use formualizer_eval::engine::{Engine, EvalConfig};
    use formualizer_workbook::traits::NamedRangeScope;
    use formualizer_workbook::{CellData, JsonAdapter, NamedRange, SpreadsheetWriter};

    fn create_test_engine() -> Engine<formualizer_eval::test_workbook::TestWorkbook> {
        let ctx = formualizer_eval::test_workbook::TestWorkbook::new();
        Engine::new(ctx, EvalConfig::default())
    }

    #[test]
    fn json_stream_registers_named_ranges() {
        let mut adapter = JsonAdapter::new();
        adapter.create_sheet("Sheet1").unwrap();
        adapter.create_sheet("Sheet2").unwrap();
        adapter
            .write_cell("Sheet2", 1, 1, CellData::from_value(0.0))
            .unwrap();

        adapter.set_named_ranges(
            "Sheet1",
            vec![
                NamedRange {
                    name: "GlobalName".into(),
                    scope: NamedRangeScope::Workbook,
                    address: RangeAddress::new("Sheet1", 1, 1, 1, 1).unwrap(),
                },
                NamedRange {
                    name: "LocalName".into(),
                    scope: NamedRangeScope::Sheet,
                    address: RangeAddress::new("Sheet1", 2, 1, 2, 2).unwrap(),
                },
            ],
        );

        let mut engine = create_test_engine();
        adapter.stream_into_engine(&mut engine).unwrap();

        let sheet_id = engine.sheet_id("Sheet1").expect("sheet present");
        let global = engine
            .resolve_name_entry("GlobalName", sheet_id)
            .map(|nr| &nr.definition)
            .expect("global name registered");

        match global {
            NamedDefinition::Cell(cell) => {
                assert_eq!(engine.sheet_name(cell.sheet_id), "Sheet1");
                assert_eq!(format!("{}", cell.coord), "$A$1");
            }
            other => panic!("expected cell definition, got {other:?}"),
        }

        let local = engine
            .resolve_name_entry("LocalName", sheet_id)
            .map(|nr| &nr.definition)
            .expect("local name registered");

        match local {
            NamedDefinition::Range(range) => {
                assert_eq!(engine.sheet_name(range.start.sheet_id), "Sheet1");
                assert_eq!(format!("{}", range.start.coord), "$A$2");
                assert_eq!(format!("{}", range.end.coord), "$B$2");
            }
            other => panic!("expected range definition, got {other:?}"),
        }
    }
}