Skip to main content

orbital_data/
lib.rs

1//! Shared typed dataset primitives for Orbital tables and charts.
2//!
3//! This crate provides [`Dataset`], [`DataRecord`], and [`DataValue`] — the
4//! canonical data model shared by `orbital-datatable` and `orbital-charts`.
5//! Because it has no UI or framework dependencies, any crate in the workspace
6//! can depend on it without introducing cycles.
7//!
8//! # Example
9//!
10//! ```rust
11//! use std::collections::HashMap;
12//! use orbital_data::{DataRecord, DataSchema, DataValue, Dataset, FieldDef};
13//!
14//! let schema = DataSchema::new(vec![
15//!     FieldDef::text("name", "Name"),
16//!     FieldDef::text("role", "Role"),
17//! ]);
18//! let record = DataRecord::new(
19//!     "1",
20//!     HashMap::from([
21//!         ("name".into(), DataValue::Text("Ada".into())),
22//!         ("role".into(), DataValue::Text("Admin".into())),
23//!     ]),
24//! );
25//! let dataset = Dataset::from_records(schema, vec![record]);
26//! assert_eq!(dataset.records.len(), 1);
27//! ```
28
29mod binding;
30mod dataset;
31mod projection;
32mod record;
33mod schema;
34mod value;
35
36pub use binding::ChartFieldBinding;
37pub use dataset::Dataset;
38pub use projection::ProjectionError;
39pub use record::DataRecord;
40pub use schema::{DataSchema, FieldDef};
41pub use value::{text_map_from_strings, CompareHint, DataType, DataValue};
42
43#[cfg(test)]
44mod tests {
45    use super::*;
46    use std::collections::HashMap;
47
48    #[test]
49    fn display_string_covers_variants() {
50        assert_eq!(DataValue::Text("hello".into()).display_string(), "hello");
51        assert_eq!(DataValue::Number(42.5).display_string(), "42.5");
52        assert_eq!(DataValue::Bool(true).display_string(), "true");
53        assert_eq!(DataValue::Null.display_string(), "");
54    }
55
56    #[test]
57    fn from_text_map_and_rows() {
58        let record =
59            DataRecord::from_text_map("a", HashMap::from([("name".into(), "Alpha".into())]));
60        assert_eq!(record.get("name").unwrap().display_string(), "Alpha");
61
62        let dataset = Dataset::from_text_rows(
63            [("name".into(), "Name".into())],
64            [("1".into(), HashMap::from([("name".into(), "Ada".into())]))],
65        );
66        assert_eq!(dataset.records.len(), 1);
67        assert_eq!(dataset.schema.fields.len(), 1);
68    }
69}