nodedb_array/schema/validation/
tiles.rs1use 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}