1#![doc = include_str!("README.md")]
7
8#![allow(incomplete_features)]
10
11#![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
22extern crate test;
24
25#[cfg(test)]
27mod benches;
28mod state;
29#[cfg(test)]
30mod tests;
31
32pub use state::{
34 Same,
35 Name
36};
37
38use state::{
40 State,
41 Main,
42 DerivedState
43};
44
45use libutils_issue::Issue;
47
48use libutils_terminal::Terminal;
50
51use libutils_console::{
53 Console,
54 Update
55};
56
57
58pub struct Report<Current: State> {
64 data: Current
65}
66
67impl 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
80impl<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
97const impl Default for Report<Main> {
99 fn default() -> Self {return Self::new("Main")}
100}