#![feature(default_field_values)]
#![feature(const_trait_impl)]
mod argument;
mod console;
mod layout;
mod problem;
#[cfg(test)]
mod tests;
use std::{
collections::HashMap as Map,
env::{
args,
vars
},
io::{
Write,
stderr
},
sync::LazyLock
};
use libutils_cage::Cage;
use libutils_threat::Threat;
use libutils_diff::Diff;
use layout::Layout;
pub use console::Console;
pub use argument::Argument;
pub static TERMINAL: Cage<Terminal> = Cage::new(Terminal {..});
pub struct Terminal {
layout: Layout = Layout {..},
arguments: LazyLock<Vec<Argument>> = LazyLock::new(|| args().map(Argument::from).collect()),
pub environment: LazyLock<Map<String, String>> = LazyLock::new(|| vars().collect()),
stderr: String = String::new()
}
impl Console for Terminal {
#[inline]
fn arguments(&self) -> &[Argument] {return self.arguments.as_slice()}
#[inline]
fn sync(&mut self) -> () {
let content = self.layout.view();
stderr().lock().write(<Diff as Into<Vec<u8>>>::into(Diff::new(self.stderr.as_bytes(), content.as_bytes())).as_ref()).unwrap();
self.stderr = content;
}
#[inline]
fn problem(&mut self, threat: Threat) -> () {self.layout.problems.push(threat.into())}
}