1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
// License: see LICENSE file at root directory of `master` branch

//! # Error

use alloc::{
    borrow::Cow,
    fmt::{self, Display, Formatter},
};

use core::{
    ops::Deref,
};

#[cfg(feature="std")]
use std::io;

/// # Error
#[derive(Debug)]
pub struct Error<'a> {

    /// # Message
    pub msg: Cow<'a, str>,

}

impl<'a> Error<'a> {

    /// # Makes new instance
    pub fn new<S>(msg: S) -> Self where S: Into<Cow<'a, str>> {
        Self {
            msg: msg.into(),
        }
    }

}

impl Display for Error<'_> {

    fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::Error> {
        f.write_str(&self.msg)
    }

}

#[cfg(feature="std")]
impl<'a> From<Error<'a>> for io::Error {

    fn from(err: Error<'a>) -> Self {
        io::Error::new(io::ErrorKind::InvalidData, err.msg)
    }

}

/// # Read-only wrapper of [`Error`][::Error]
///
/// [::Error]: struct.Error.html
#[derive(Debug)]
pub struct ReadOnlyError<'a> {
    err: Error<'a>,
}

impl<'a> ReadOnlyError<'a> {

    /// # Makes new instance
    pub const fn new(err: Error<'a>) -> Self {
        Self {
            err,
        }
    }

}

impl<'a> Deref for ReadOnlyError<'a> {

    type Target = Error<'a>;

    fn deref(&self) -> &Self::Target {
        &self.err
    }

}

impl Display for ReadOnlyError<'_> {

    fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::Error> {
        self.err.fmt(f)
    }

}

impl<'a> From<Error<'a>> for ReadOnlyError<'a> {

    fn from(err: Error<'a>) -> Self {
        Self::new(err)
    }

}

#[cfg(feature="std")]
impl<'a> From<ReadOnlyError<'a>> for io::Error {

    fn from(err: ReadOnlyError<'a>) -> Self {
        err.into()
    }

}