1use std::error::Error;
6use std::fmt::{Display, Formatter};
7
8#[derive(Clone, Debug)]
14pub struct OpenError {
15 kind: OpenErrorKind,
16 detail: String,
17}
18
19impl OpenError {
20 pub fn detail(&self) -> &str {
21 self.detail.as_ref()
22 }
23
24 pub fn kind(&self) -> OpenErrorKind {
25 self.kind
26 }
27
28 pub fn new(kind: OpenErrorKind, detail: String) -> OpenError {
29 OpenError { kind, detail }
30 }
31}
32
33impl Display for OpenError {
34 fn fmt(&self, f: &mut Formatter) -> Result<(), ::std::fmt::Error> {
35 f.write_str(self.kind.as_str())?;
37 if !self.detail.is_empty() {
38 f.write_str(" (")?;
39 f.write_str(self.detail.as_ref())?;
40 f.write_str(")")?;
41 }
42 Ok(())
43 }
44}
45
46impl Error for OpenError {
47 fn description(&self) -> &str {
48 self.kind.as_str()
49 }
50}
51
52#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
57pub enum OpenErrorKind {
58 Library,
59 Symbol,
60}
61
62impl OpenErrorKind {
63 pub fn as_str(self) -> &'static str {
64 match self {
65 OpenErrorKind::Library => "opening library failed",
66 OpenErrorKind::Symbol => "loading symbol failed",
67 }
68 }
69}