Skip to main content

nhs_number/
parse_error.rs

1//! The error type returned by [`NHSNumber::from_str`](crate::NHSNumber).
2//!
3//! `ParseError` is a zero-sized unit struct that signals "this string is
4//! not a syntactically valid NHS Number". It deliberately carries no
5//! detail — callers who need a richer taxonomy (wrong length, wrong
6//! separator, non-digit character, …) wrap or map it at the parse site.
7//!
8//! See [`spec.md`](https://github.com/joelparkerhenderson/nhs-number-using-rust/blob/main/spec.md)
9//! §12 for the design rationale.
10
11/// Error returned by `<NHSNumber as FromStr>::from_str` for any string
12/// that is not one of the two accepted shapes (see [`spec.md`] §5).
13///
14/// `ParseError` is a unit struct — every error value compares equal:
15///
16/// ```rust
17/// use nhs_number::NHSNumber;
18/// use nhs_number::parse_error::ParseError;
19/// use std::str::FromStr;
20///
21/// let a = NHSNumber::from_str("not even close").unwrap_err();
22/// let b = NHSNumber::from_str("wrong length").unwrap_err();
23/// assert_eq!(a, b);
24/// assert_eq!(a, ParseError);
25/// ```
26///
27/// To map it to your own richer error type:
28///
29/// ```rust
30/// use nhs_number::NHSNumber;
31/// use std::str::FromStr;
32///
33/// #[derive(Debug, PartialEq)]
34/// enum MyError {
35///     BadNhsNumber(String),
36/// }
37///
38/// let bad = "not a number";
39/// let result: Result<NHSNumber, MyError> =
40///     NHSNumber::from_str(bad).map_err(|_| MyError::BadNhsNumber(bad.into()));
41/// assert_eq!(result, Err(MyError::BadNhsNumber("not a number".into())));
42/// ```
43///
44/// [`spec.md`]: https://github.com/joelparkerhenderson/nhs-number-using-rust/blob/main/spec.md
45#[derive(Debug, PartialEq, Eq)]
46pub struct ParseError;
47
48#[cfg(test)]
49mod tests {
50    use super::*;
51
52    #[test]
53    fn test_parse_error_is_zero_sized() {
54        assert_eq!(std::mem::size_of::<ParseError>(), 0);
55    }
56
57    #[test]
58    fn test_parse_error_equality() {
59        assert_eq!(ParseError, ParseError);
60    }
61
62    #[test]
63    fn test_parse_error_debug() {
64        let dbg = format!("{:?}", ParseError);
65        assert_eq!(dbg, "ParseError");
66    }
67}