Skip to main content

libutils_report/
mod.rs

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