line_cardinality/count_unique_impl/
result.rs

1// This file is part of line_cardinality. Copyright © 2024 line_cardinality contributors.
2// line_cardinality is licensed under the GNU GPL v3.0 or any later version. See LICENSE file for full text.
3
4use std::error::Error as StdError;
5use std::fmt::{Display, Formatter};
6use std::io;
7
8pub(crate) type Result = std::result::Result<(), Error>;
9
10#[derive(Debug)]
11enum Message {
12    Dynamic(String),
13    Static(&'static str),
14}
15
16/// Contains the cause of an [`Error`]
17#[derive(Debug)]
18pub enum Cause {
19    /// IO error
20    Io(io::Error),
21    /// Improper usize
22    Size(usize),
23    /// User-proved error message
24    User,
25}
26
27/// Errors returned by line_cardinality
28#[derive(Debug)]
29pub struct Error {
30    message: Message,
31    cause: Cause,
32}
33
34impl Error {
35    /// Wraps IO errors with a static message
36    pub fn io_static(message: &'static str, cause: io::Error) -> Self {
37        Self {
38            message: Message::Static(message),
39            cause: Cause::Io(cause),
40        }
41    }
42
43    /// Wraps IO errors
44    pub fn io(message: String, cause: io::Error) -> Self {
45        Self {
46            message: Message::Dynamic(message),
47            cause: Cause::Io(cause),
48        }
49    }
50
51    /// User-provided error with a static message
52    pub fn message_static(message: &'static str) -> Self {
53        Self {
54            message: Message::Static(message),
55            cause: Cause::User,
56        }
57    }
58
59    /// User-provided error
60    pub fn message(message: String) -> Self {
61        Self {
62            message: Message::Dynamic(message),
63            cause: Cause::User,
64        }
65    }
66
67    pub(crate) fn hyper_log_log(message: String, size: usize) -> Self {
68        Self {
69            message: Message::Dynamic(message),
70            cause: Cause::Size(size),
71        }
72    }
73
74    pub fn get_cause(&self) -> &Cause {
75        &self.cause
76    }
77}
78
79impl StdError for Error {
80    fn source(&self) -> Option<&(dyn StdError + 'static)> {
81        match &self.cause {
82            Cause::Io(e) => Some(e),
83            Cause::Size(_) => None,
84            Cause::User => None,
85        }
86    }
87}
88
89impl Display for Error {
90    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
91        match &self.message {
92            Message::Dynamic(string) => write!(f, "{}", string),
93            Message::Static(str) => write!(f, "{}", str),
94        }
95    }
96}