Skip to main content

nodedb_array/schema/validation/
tiles.rs

1// SPDX-License-Identifier: Apache-2.0
2
3//! Tile-extent validation.
4//!
5//! Rules:
6//! - `tile_extents.len() == dims.len()`.
7//! - Each extent is non-zero (a zero-extent tile is degenerate).
8
9use crate::error::{ArrayError, ArrayResult};
10use crate::schema::dim_spec::DimSpec;
11
12pub fn check(array: &str, dims: &[DimSpec], extents: &[u64]) -> ArrayResult<()> {
13    if extents.len() != dims.len() {
14        return Err(ArrayError::InvalidTileExtents {
15            array: array.to_string(),
16            detail: format!(
17                "expected {} extents (one per dim), got {}",
18                dims.len(),
19                extents.len()
20            ),
21        });
22    }
23    for (i, e) in extents.iter().enumerate() {
24        if *e == 0 {
25            return Err(ArrayError::InvalidTileExtents {
26                array: array.to_string(),
27                detail: format!(
28                    "tile extent for dim '{}' is zero",
29                    dims.get(i).map(|d| d.name.as_str()).unwrap_or("?"),
30                ),
31            });
32        }
33    }
34    Ok(())
35}
36
37#[cfg(test)]
38mod tests {
39    use super::*;
40    use crate::schema::dim_spec::DimType;
41    use crate::types::domain::{Domain, DomainBound};
42
43    fn int_dim(name: &str) -> DimSpec {
44        DimSpec::new(
45            name,
46            DimType::Int64,
47            Domain::new(DomainBound::Int64(0), DomainBound::Int64(10)),
48        )
49    }
50
51    #[test]
52    fn rejects_arity_mismatch() {
53        let dims = vec![int_dim("x"), int_dim("y")];
54        assert!(check("a", &dims, &[1]).is_err());
55    }
56
57    #[test]
58    fn rejects_zero_extent() {
59        let dims = vec![int_dim("x")];
60        assert!(check("a", &dims, &[0]).is_err());
61    }
62
63    #[test]
64    fn accepts_well_formed_extents() {
65        let dims = vec![int_dim("x"), int_dim("y")];
66        assert!(check("a", &dims, &[1, 100]).is_ok());
67    }
68}