1#![allow(incomplete_features)]
7
8#![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
19extern crate test;
21
22#[cfg(test)]
24mod benches;
25mod state;
26#[cfg(test)]
27mod tests;
28
29pub use state::{
31 Same,
32 Name
33};
34
35use state::{
37 State,
38 Main,
39 DerivedState
40};
41
42use libutils_issue::Issue;
44
45use libutils_terminal::Terminal;
47
48use libutils_console::{
50 Console,
51 Update
52};
53
54
55pub struct Report<Current: State> {
61 data: Current
62}
63
64impl 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
77impl<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
94const impl Default for Report<Main> {
96 fn default() -> Self {return Self::new("Main")}
97}