active-reporting 1.0.3

A custom error wrapper for detailed logs
Documentation
//^
//^ HEAD
//^

//> HEAD -> SUPER
use super::Report;

//> HEAD -> CORE
use core::{
    ptr::NonNull,
    marker::PhantomCovariantLifetime
};

//> HEAD -> ALLOC
use alloc::vec::Vec;


//^
//^ ROOT
//^

//> ROOT -> STRUCT
pub struct Root {
    chain: Vec<&'static str>
}

//> ROOT -> IMPLEMENTATION
impl Root {
    pub const fn new(name: &'static str) -> Self {return Self {
        chain: if name.is_empty() {Vec::new()} else {
            let mut chain = Vec::new();
            chain.push(name);
            chain
        }
    }}
    pub const fn chain(&self) -> &[&'static str] {return self.chain.as_slice()}
    pub const fn to<'valid, 'next, const NAME: &'static str>(&'valid mut self) -> Report<'next, NAME> where 'valid: 'next {
        if !NAME.is_empty() {self.chain.push(NAME);}
        return Report {
            chain: NonNull::new(&raw mut self.chain).unwrap(),
            _lifetime: PhantomCovariantLifetime::new()
        }
    }
}

//> ROOT -> DEFAULT
const impl Default for Root {
    fn default() -> Self {return Self::new("Main")}
}

//> ROOT -> !SYNC
impl !Sync for Root {}