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 -> CONSOLE
41use libutils_console::{
42    Console, 
43    Update
44};
45
46
47//^ 
48//^ REPORT
49//^ 
50
51//> REPORT -> STRUCT
52pub struct Report<Current: State> {
53    data: Current
54}
55
56//> REPORT -> MAIN IMPLEMENTATION
57impl Report<Main> {
58    pub const fn new(name: &'static str) -> Self {
59        let mut chain = Vec::new();
60        chain.push(name);
61        return Self {
62            data: Main {
63                chain: chain
64            }
65        };
66    }
67}
68
69//> REPORT -> IMPLEMENTATION
70impl<Current: const State> Report<Current> {
71    pub const fn to<'valid, Following: const DerivedState<'valid>>(&'valid mut self) -> Report<Following> {
72        return Report {
73            data: Following::convert(&mut self.data)
74        }
75    }
76    pub fn issue(&self, object: impl Into<Issue>) -> Option<!> {
77        Terminal.problem(object.into(), self.data.get()).sync();
78        return None;
79    }
80    pub fn eat<Type>(&self, result: Result<Type, Issue>) -> Option<Type> {return match result {
81        Ok(value) => Some(value),
82        Err(issue) => self.issue(issue)?
83    }}
84}
85
86//> REPORT -> DEFAULT
87const impl Default for Report<Main> {
88    fn default() -> Self {return Self::new("Main")}
89}