logging-rs 1.1.0

logging-rs helps you add logging to your projects using simple macros.
Documentation
#![doc = include_str!("../.github/errors.md")]
// logging-rs errors
// Version: 1.1.0

// Copyright (c) 2023-present ElBe Development.

// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the 'Software'),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.

////////////////////////////////
// IMPORTS AND USE STATEMENTS //
////////////////////////////////

use std::fmt;


///////////
// ERROR //
///////////

/// Error object.
///
/// Use [`Error::new()`] to create error objects instead of using this struct.
///
/// # Parameters
///
/// - `name`: The errors name.
/// - `description`: The error description.
/// - `exit_code`: The errors exit code.
///
/// # Returns
///
/// A new `Error` object with the specified name and description.
///
/// # Examples
///
/// ```rust
/// # use logging_rs;
/// logging_rs::errors::Error {
///     name: "name".to_owned(),
///     description: "description".to_owned(),
///     exit_code: 1
/// };
/// ```
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub struct Error {
    /// The errors name.
    pub name: String,
    /// The error description.
    pub description: String,
    /// The errors exit code.
    pub exit_code: i32,
}

/// Display implementation for the error object.
impl fmt::Display for Error {
    /// Format implementation for the error object.
    ///
    /// # Parameters
    ///
    /// - `self`: The error object.
    /// - `f`: The [`fmt::Formatter`] to use.
    ///
    /// # Returns
    ///
    /// A [`fmt::Result`] containing the formatted error message.
    ///
    /// # Examples
    ///
    /// ```rust
    /// # use logging_rs;
    /// # let error = logging_rs::errors::Error::new("name", "description", 1);
    /// println!("{}", error);
    /// ```
    ///
    /// # See also
    ///
    /// - [`fmt::Display`]
    /// - [`Error`]
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "\x1b[31;1m{}\x1b[0m: {}", self.name, self.description)
    }
}

impl Error {
    /// Creates a new error object.
    ///
    /// # Parameters
    ///
    /// - `name`: The errors name.
    /// - `description`: The error description.
    /// - `exit_code`: The errors exit code.
    ///
    /// # Returns
    ///
    /// A new `Error` object with the specified name and description.
    ///
    /// # Examples
    ///
    /// ```rust
    /// # use logging_rs;
    /// logging_rs::errors::Error::new("name", "description", 1);
    /// ```
    ///
    /// # See also
    ///
    /// - [`Error`]
    pub fn new(name: &str, description: &str, exit_code: i32) -> Error {
        return Error {
            name: name.to_owned(),
            description: description.to_owned(),
            exit_code: exit_code,
        };
    }

    /// Raises the error and exits with the specified exit code.
    ///
    /// # Parameters
    ///
    /// - `self`: The error object.
    /// - `details`: The error details.
    ///
    /// # Aborts
    ///
    /// Exits with the specified exit code.
    ///
    /// # Examples
    ///
    /// ```should_panic
    /// # use logging_rs;
    /// # let error: logging_rs::errors::Error = logging_rs::errors::Error::new("name", "description", 1);
    /// error.raise("Something went very wrong");
    /// ```
    ///
    /// # See also
    ///
    /// - [`Error`]
    pub fn raise(&self, details: &str) {
        eprintln!("{}", self);
        eprintln!("{}", details);

        std::process::exit(self.exit_code);
    }
}