Skip to main content

libutils_report/
mod.rs

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