use std::{env::VarError, io::Write};
pub trait VirtualIo {
fn print<S: Into<String>>(&mut self, message: S) -> &mut Self;
fn println<S: Into<String>>(&mut self, message: S) -> &mut Self;
fn read_line(&mut self) -> String;
fn get_environment_var<S: Into<String>>(&self, variable: S) -> Result<String, VarError>;
fn get_environment_vars(&self) -> Vec<(String, String)>;
}
#[derive(PartialEq, Eq, Debug, Default)]
pub struct Vio {}
impl VirtualIo for Vio {
fn print<S: Into<String>>(&mut self, message: S) -> &mut Self {
print!("{}", message.into());
if std::io::stdout().flush().is_ok() {};
self
}
fn println<S: Into<String>>(&mut self, message: S) -> &mut Self {
println!("{}", message.into());
self
}
fn read_line(&mut self) -> String {
let mut input = String::new();
match std::io::stdin().read_line(&mut input) {
Ok(_) => input.trim().to_string(),
Err(_) => String::new(),
}
}
fn get_environment_var<S: Into<String>>(&self, variable: S) -> Result<String, VarError> {
std::env::var(variable.into())
}
fn get_environment_vars(&self) -> Vec<(String, String)> {
std::env::vars().collect()
}
}
impl Vio {
#[must_use]
pub const fn new() -> Self {
Self {}
}
}