Skip to main content

libutils_report/
mod.rs

1//^
2//^ HEAD
3//^
4
5//> HEAD -> FEATURES
6#![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(const_heap)]
12#![feature(const_default)]
13#![feature(never_type)]
14#![feature(generic_const_exprs)]
15
16//> HEAD -> MODULES
17mod state;
18#[cfg(test)]
19mod tests;
20
21//> HEAD -> PUBLIC STATE
22pub use state::{
23    Same,
24    Name
25};
26
27//> HEAD -> STATE
28use state::{
29    State,
30    Main,
31    DerivedState
32};
33
34//> HEAD -> ISSUE
35use libutils_issue::Issue;
36
37//> HEAD -> TERMINAL
38use libutils_terminal::TERMINAL;
39
40//> HEAD -> THREAT
41use libutils_threat::Threat;
42
43//> HEAD -> CONSOLE
44use libutils_console::{
45    Console, 
46    Synchronization
47};
48
49
50//^ 
51//^ REPORT
52//^ 
53
54//> REPORT -> STRUCT
55pub struct Report<Current: State> {
56    data: Current
57}
58
59//> REPORT -> IMPLEMENTATION
60impl Report<Main> {
61    pub const fn new(name: &'static str) -> Self {
62        let mut chain = Vec::new();
63        chain.push(name);
64        return Self {
65            data: Main {
66                chain: chain
67            }
68        };
69    }
70}
71
72//> REPORT -> DEFAULT
73const impl Default for Report<Main> {
74    fn default() -> Self {return Self::new("Main")}
75}
76
77//> REPORT -> IMPLEMENTATION
78impl<Current: State> Report<Current> {
79    pub fn to<'valid, Following: DerivedState<'valid>>(&'valid mut self) -> Report<Following> {return Report {
80        data: Following::convert(&mut self.data)
81    }}
82    pub fn issue(&self, object: impl Into<Issue>) -> Option<!> {
83        TERMINAL.problem(Threat {
84            issue: object.into(),
85            chain: self.data.chain()
86        }).sync();
87        return None;
88    }
89    pub fn eat<Type>(&self, result: Result<Type, Issue>) -> Option<Type> {return match result {
90        Ok(value) => Some(value),
91        Err(issue) => self.issue(issue)?
92    }}
93}