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 107 108 109
// Copyright (c) 2024, BlockProject 3D
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither the name of BlockProject 3D nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
use bp3d_debug::logger::Level;
/// An enum representing the available verbosity levels of the logger.
#[repr(u8)]
#[derive(Clone, PartialEq, Copy, Ord, PartialOrd, Eq, Debug, Hash)]
pub enum LevelFilter {
/// The "none" level.
///
/// This level is used to disable logging.
None = 0,
/// The "trace" level.
///
/// Designates very low priority, often extremely verbose, information.
Trace = 1,
/// The "debug" level.
///
/// Designates lower priority information.
Debug = 2,
/// The "info" level.
///
/// Designates useful information.
Info = 3,
/// The "warn" level.
///
/// Designates hazardous situations.
Warn = 4,
/// The "error" level.
///
/// Designates very serious errors.
// This way these line up with the discriminants for LevelFilter below
// This works because Rust treats field-less enums the same way as C does:
// https://doc.rust-lang.org/reference/items/enumerations.html#custom-discriminant-values-for-field-less-enumerations
Error = 5,
}
impl LevelFilter {
/// Creates a new [LevelFilter](LevelFilter) from an existing u8 value.
///
/// This returns None if the value could not be found.
///
/// # Arguments
///
/// * `value`: the value to convert from.
///
/// returns: Option<LevelFilter>
#[allow(clippy::missing_transmute_annotations)]
pub fn from_u8(value: u8) -> Option<Self> {
if value > 5 {
None
} else {
// SAFETY: This is safe because LevelFilter is a u8 and we have checked that the variant
// index is not out of bounds.
unsafe { std::mem::transmute(value) }
}
}
}
impl From<&Level> for LevelFilter {
#[allow(clippy::missing_transmute_annotations)]
fn from(value: &Level) -> Self {
// SAFETY: This is safe because both Level and LevelFilter are u8 values and Level shares
// the same variants as LevelFilter (with the exception that LevelFilter has one more
// variant at 0).
unsafe { std::mem::transmute(*value) }
}
}
impl From<Level> for LevelFilter {
#[allow(clippy::missing_transmute_annotations)]
fn from(value: Level) -> Self {
// SAFETY: This is safe because both Level and LevelFilter are u8 values and Level shares
// the same variants as LevelFilter (with the exception that LevelFilter has one more
// variant at 0).
unsafe { std::mem::transmute(value) }
}
}