topology_checker_core/error.rs
1use crate::{GeometryKind, LayerId, Rule};
2
3/// Operational failures are distinct from topology violations.
4#[derive(Debug, Clone, thiserror::Error)]
5#[non_exhaustive]
6pub enum Error {
7 /// A negative or non-finite planar tolerance.
8 #[error("tolerance must be finite and nonnegative, found {0}")]
9 Tolerance(f64),
10 /// A layer index not registered in the topology.
11 #[error("unknown layer {0:?}")]
12 UnknownLayer(LayerId),
13 /// A feature incompatible with a rule's required geometry family.
14 #[error("layer {name}, FID {fid}: expected {expected:?}, found {found:?}")]
15 GeometryKind {
16 /// Topology-scoped layer ID.
17 layer: LayerId,
18 /// Caller-supplied layer name, which need not be unique.
19 name: String,
20 /// Signed input feature ID.
21 fid: i64,
22 /// Required geometry family.
23 expected: GeometryKind,
24 /// Actual geometry family.
25 found: GeometryKind,
26 },
27 /// An input feature contains an infinite or NaN coordinate.
28 #[error("layer {name}, FID {fid}: coordinates must be finite")]
29 NonFinite {
30 /// Topology-scoped layer ID.
31 layer: LayerId,
32 /// Caller-supplied layer name, which need not be unique.
33 name: String,
34 /// Signed input feature ID.
35 fid: i64,
36 },
37 /// Two features within one layer share an ID.
38 #[error("layer {name}: duplicate FID {fid}")]
39 DuplicateFid {
40 /// Topology-scoped layer ID.
41 layer: LayerId,
42 /// Caller-supplied layer name, which need not be unique.
43 name: String,
44 /// Repeated signed feature ID.
45 fid: i64,
46 },
47 /// An incorrect number of input layers for a rule.
48 #[error("{rule} requires {expected} input layer(s)")]
49 Inputs {
50 /// Rule being registered.
51 rule: Rule,
52 /// Required number of distinct input layers.
53 expected: usize,
54 },
55 /// One layer supplied as both inputs of a binary rule.
56 #[error("{rule} requires two distinct input layers")]
57 SameLayer {
58 /// Rule being registered.
59 rule: Rule,
60 /// Layer supplied twice.
61 layer: LayerId,
62 },
63 /// A line utility input contains an infinite or NaN coordinate.
64 #[error("line {index}: coordinates must be finite")]
65 NonFiniteLine {
66 /// Zero-based position in the input lines.
67 index: usize,
68 },
69}