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