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}