Skip to main content

libutils_terminal/
mod.rs

1//^
2//^ HEAD
3//^
4
5//> HEAD -> DOCS
6#![doc = include_str!("README.md")]
7
8//> HEAD -> FEATURES
9#![feature(const_trait_impl)]
10#![feature(const_default)]
11#![feature(test)]
12#![feature(transmute_neo)]
13
14//> HEAD -> CRATES
15extern crate test;
16
17//> HEAD -> MODULES
18#[cfg(test)]
19mod benches;
20mod descriptor;
21mod metadata;
22mod problem;
23mod section;
24#[cfg(test)]
25mod tests;
26mod update;
27
28//> HEAD -> STD
29use std::{
30    env::args, 
31    fs::File, 
32    path::PathBuf, 
33    sync::LazyLock, 
34    time::Instant
35};
36
37//> HEAD -> CORE
38use core::fmt::{
39    Debug, 
40    Display
41};
42
43//> HEAD -> CAGELOCK
44use cagelock::Cage;
45
46//> HEAD -> UPDATE
47use update::Update;
48
49//> HEAD -> ISSUING
50use issuing::{
51    Issue,
52    Severity
53};
54
55//> HEAD -> CONSOLE
56use libutils_console::{
57    Console,
58    Argument,
59    Update as UpdateTrait,
60    Descriptor as DescriptorTrait
61};
62
63//> HEAD -> SECTION
64use section::Section;
65
66//> HEAD -> PROBLEM
67use problem::Problem;
68
69//> HEAD -> DESCRIPTOR
70use descriptor::Descriptor;
71
72
73//^
74//^ TERMINAL
75//^
76
77//> TERMINAL -> DATA
78static ARGUMENTS: LazyLock<Vec<Argument>> = LazyLock::new(|| args().map(Argument::from).collect());
79static LAYOUT: Cage<Vec<Section>> = Cage::default();
80static OUTPUT: Cage<String> = Cage::default();
81
82//> TERMINAL -> STRUCT
83pub struct Terminal;
84
85//> TERMINAL -> IMPLEMENTATION
86impl Console for Terminal {
87    fn arguments() -> &'static [Argument] {return ARGUMENTS.as_slice()}
88    fn open(filename: &str) -> Result<impl DescriptorTrait, Issue> {
89        match File::open(PathBuf::from(filename)) {
90            Ok(file) => Ok(Descriptor {
91                file: file
92            }),
93            Err(error) => Err(Issue {
94                name: "Failed to open file",
95                description: Some(error.to_string()),
96                severity: Severity::Error
97            })
98        }
99    }
100    fn problem(issue: Issue, chain: &[&'static str]) -> impl UpdateTrait {
101        LAYOUT.write(|layout| layout.push(Section::Problem(Problem {
102            chain: Vec::from(chain),
103            issue: issue,
104            _at: Instant::now()
105        })));
106        return Update;
107    }
108    fn print(value: impl Display) -> impl UpdateTrait {
109        LAYOUT.write(|layout| layout.push(Section::Display(value.to_string())));
110        return Update;
111    }
112    fn debug(value: impl Debug) -> impl UpdateTrait {
113        LAYOUT.write(|layout| layout.push(Section::Debug(format!("{value:#?}"))));
114        return Update;
115    }
116    fn clear() -> impl UpdateTrait {
117        LAYOUT.write(Vec::clear);
118        return Update;
119    }
120}