1#![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
20mod act;
22mod shortcut;
23#[cfg(test)]
24mod tests;
25
26use libutils_array::Array;
28
29use libutils_terminal::{
31 TERMINAL,
32 Console
33};
34
35use libutils_issue::Issue;
37
38use libutils_problem::{
40 Threat,
41 Severity
42};
43
44pub use act::Act;
46
47use core::mem::transmute_neo as transmute;
49
50
51pub struct Report<const NAME: &'static str, const N: usize> {
57 chain: Array<&'static str, N>
58}
59
60const 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
71impl<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}