1#![allow(incomplete_features)]
7#![feature(const_trait_impl)]
8#![feature(unsized_const_params)]
9#![feature(adt_const_params)]
10#![feature(default_field_values)]
11#![feature(generic_const_exprs)]
12
13mod state;
15#[cfg(test)]
16mod tests;
17
18pub use state::{
20 Add,
21 Stay
22};
23
24use state::{
26 State,
27 Main,
28 DerivedState
29};
30
31use libutils_issue::Issue;
33
34use libutils_terminal::{
36 TERMINAL,
37 Console
38};
39
40use libutils_threat::{
42 Threat,
43 Severity
44};
45
46
47pub struct Report<Current: State> {
53 data: Current
54}
55
56impl Report<Main> {
58 pub fn new(name: &'static str) -> Self {Self {
59 data: Main {
60 chain: Vec::from([name])
61 }
62 }}
63}
64
65impl<Current: State> Report<Current> {
67 #[inline]
68 pub fn to<'valid, Following: DerivedState<'valid>>(&'valid mut self) -> Report<Following> {return Report {
69 data: Following::from(&mut self.data)
70 }}
71 #[inline]
72 pub fn warn<Object: Into<Issue>>(&self, object: Object) -> () {TERMINAL.write().problem(Threat {
73 object: object,
74 chain: self.data.chain(),
75 severity: Severity::Warning
76 })}
77 #[inline]
78 pub fn error<Object: Into<Issue>>(&self, object: Object) -> () {TERMINAL.write().problem(Threat {
79 object: object,
80 chain: self.data.chain(),
81 severity: Severity::Error
82 })}
83 #[inline]
84 pub fn critical<Object: Into<Issue>>(&self, object: Object) -> () {TERMINAL.write().problem(Threat {
85 object: object,
86 chain: self.data.chain(),
87 severity: Severity::Critical
88 })}
89}