| 67 | } |
| 68 | |
| 69 | fn check_bound_order(array: &str, d: &DimSpec) -> ArrayResult<()> { |
| 70 | let ordered = match (&d.domain.lo, &d.domain.hi) { |
| 71 | (DomainBound::Int64(lo), DomainBound::Int64(hi)) => lo <= hi, |
| 72 | (DomainBound::Float64(lo), DomainBound::Float64(hi)) => { |
| 73 | !lo.is_nan() && !hi.is_nan() && lo <= hi |
| 74 | } |
| 75 | (DomainBound::TimestampMs(lo), DomainBound::TimestampMs(hi)) => lo <= hi, |
| 76 | (DomainBound::String(lo), DomainBound::String(hi)) => lo <= hi, |
| 77 | _ => true, |
| 78 | }; |
| 79 | if !ordered { |
| 80 | return Err(ArrayError::InvalidDim { |
| 81 | array: array.to_string(), |
| 82 | dim: d.name.clone(), |
| 83 | detail: "domain lo > hi (or non-finite float bound)".to_string(), |
| 84 | }); |
| 85 | } |
| 86 | Ok(()) |
| 87 | } |
| 88 | |
| 89 | #[cfg(test)] |
| 90 | mod tests { |