irust 0.4.5

Cross Platform Rust Repl
use crate::irust::printer::{Printer, PrinterItem, PrinterItemType};
use crate::irust::IRust;
use crossterm::{ClearType, Color};

impl IRust {
    pub fn wait_add(&mut self, add_cmd: std::process::Child, msg: &str) -> std::io::Result<()> {
        self.cursor.hide()?;
        self.color.set_fg(Color::Cyan)?;

        match self.wait_add_inner(add_cmd, msg) {
            Ok(status) => {
                self.write_newline()?;
                self.cursor.show()?;
                self.color.reset()?;

                if status.success() {
                    Ok(())
                } else {
                    Err(std::io::Error::last_os_error())
                }
            }
            Err(e) => {
                self.write_newline()?;
                self.cursor.show()?;
                self.color.reset()?;
                Err(e)
            }
        }
    }

    fn wait_add_inner(
        &mut self,
        mut add_cmd: std::process::Child,
        msg: &str,
    ) -> std::io::Result<std::process::ExitStatus> {
        self.write_str_at(&format!(" {}ing dep [\\]", msg), 0, None)?;
        loop {
            match add_cmd.try_wait() {
                Ok(None) => {
                    self.write_str_at("\\", msg.len() + 10, None)?;
                    self.write_str_at("|", msg.len() + 10, None)?;
                    self.write_str_at("/", msg.len() + 10, None)?;
                    self.write_str_at("-", msg.len() + 10, None)?;
                    self.write_str_at("\\", msg.len() + 10, None)?;
                    self.write_str_at("|", msg.len() + 10, None)?;
                    self.write_str_at("/", msg.len() + 10, None)?;
                    self.write_str_at("-", msg.len() + 10, None)?;
                    continue;
                }
                Err(e) => {
                    return Err(e);
                }
                Ok(Some(status)) => return Ok(status),
            }
        }
    }

    pub fn welcome(&mut self) -> std::io::Result<()> {
        self.terminal.clear(ClearType::All)?;

        let default_msg = "Welcome to IRust".to_string();
        self.printer = Printer::new(PrinterItem::new(default_msg, PrinterItemType::Welcome));
        self.printer.add_new_line(1);

        self.write_out()?;

        Ok(())
    }

    pub fn fit_msg(&mut self, msg: &str) -> String {
        let slash_num = self.terminal.terminal_size().0 as usize - msg.len();
        let slash = std::iter::repeat('-')
            .take(slash_num / 2)
            .collect::<String>();

        format!("{0}{1}{0}", slash, msg)
    }
}