Skip to main content

libutils_report/
mod.rs

1//^
2//^ HEAD
3//^
4
5//> HEAD -> FEATURES
6#![allow(incomplete_features)]
7#![feature(transmute_neo)]
8#![feature(const_destruct)]
9#![feature(try_trait_v2)]
10#![feature(try_trait_v2_residual)]
11#![feature(const_try)]
12#![feature(const_default)]
13#![feature(const_trait_impl)]
14#![feature(unsized_const_params)]
15#![feature(adt_const_params)]
16#![feature(generic_const_exprs)]
17#![feature(const_try_residual)]
18#![feature(const_option_ops)]
19
20//> HEAD -> MODULES
21mod act;
22mod shortcut;
23#[cfg(test)]
24mod tests;
25
26//> HEAD -> ARRAY
27use libutils_array::Array;
28
29//> HEAD -> TERMINAL
30use libutils_terminal::{
31    TERMINAL,
32    Console
33};
34
35//> HEAD -> ISSUE
36use libutils_issue::Issue;
37
38//> HEAD -> PROBLEM
39use libutils_problem::{
40    Threat,
41    Severity
42};
43
44//> HEAD -> ACT
45pub use act::Act;
46
47//> HEAD -> CORE
48use core::mem::transmute_neo as transmute;
49
50
51//^
52//^ REPORT
53//^
54
55//> REPORT -> STRUCT
56pub struct Report<const NAME: &'static str, const N: usize> {
57    chain: Array<&'static str, N>
58}
59
60//> REPORT -> DEFAULT
61const impl Default for Report<"Main", 1> {
62    fn default() -> Self {
63        let mut chain = Array::default();
64        chain.push("Main");
65        return Self {
66            chain: chain
67        }
68    }
69}
70
71//> REPORT -> IMPLEMENTATION
72impl<const NAME: &'static str, const N: usize> Report<NAME, N> {
73    #[inline]
74    pub fn warn<Object: Into<Issue>>(&self, object: Object) -> () {TERMINAL.write().problem(Threat {
75        chain: self.chain.clone(),
76        object: object,
77        severity: Severity::Warning
78    })}
79    #[inline]
80    pub fn error<Object: Into<Issue>>(&self, object: Object) -> () {TERMINAL.write().problem(Threat {
81        chain: self.chain.clone(),
82        object: object,
83        severity: Severity::Error
84    })}
85    #[inline]
86    pub fn sub<'valid, const OTHER: &'static str>(&'valid self) -> Report<OTHER, {N + 1}> {
87        let mut chain = Array::from_iter(self.chain.clone().into_iter());
88        chain.push(OTHER);
89        return Report {
90            chain: chain
91        }
92    }
93    #[inline]
94    pub fn with<Type>(self, value: Type) -> Act<Type> {return unsafe {transmute(Some(value))}}
95    #[inline]
96    pub fn with_default<Type: Default>(self) -> Act<Type> {return unsafe {transmute(Some(Type::default()))}}
97    #[inline]
98    pub fn fail<Type, Object: Into<Issue>>(self, object: Object) -> Act<Type> {
99        TERMINAL.write().problem(Threat {
100            chain: self.chain.clone(),
101            object: object,
102            severity: Severity::Critical
103        });
104        return unsafe {transmute(None::<Type>)};
105    }
106}