Skip to main content

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}