mod diff;
mod handler;
mod layout;
mod problem;
use std::{
env::{
args,
vars
},
collections::HashMap
};
use handler::Handler;
use core::default::Default;
use crate::{
cage::Cage,
report::ToIssue
};
use diff::Diff;
use layout::Layout;
pub use problem::Problem;
pub static TERMINAL: Cage<Terminal> = Cage::new(Terminal {
handler: Handler,
layout: Layout::default(),
stderr: String::new()
});
pub struct Terminal {
handler: Handler,
layout: Layout,
stderr: String
}
impl Terminal {
pub fn arguments(&self) -> Vec<String> {args().collect()}
pub fn environment(&self) -> HashMap<String, String> {vars().collect()}
#[inline]
fn render(&mut self) -> () {
let content = self.layout.view();
self.handler.sync(Diff::new(&self.stderr, &content));
self.stderr = content;
}
#[inline]
pub fn error<Object: ToIssue>(&mut self, problem: &Problem<Object>) -> () {
self.layout.logs.push(problem.to_string());
self.render();
}
}