cubic 0.17.0

Cubic is a lightweight command line manager for virtual machines. It has a simple, daemon-less and rootless design. All Cubic virtual machines run isolated in the user context. Cubic is built on top of QEMU, KVM and cloud-init. Show all supported images: $ cubic images Create a new virtual machine instance: $ cubic create mymachine --image ubuntu:noble List all virtual machine instances: $ cubic instances Start an instance: $ cubic start <instance name> Stop an instance: $ cubic stop <instance name> Open a shell in the instance: $ cubic ssh <machine name> Copy a file from the host to the instance: $ cubic scp <path/to/host/file> <machine>:<path/to/guest/file> Copy a file from the instance to the hots: $ cubic scp <machine>:<path/to/guest/file> <path/to/host/file>
use crate::commands::Verbosity;
use crate::view::Console;
use std::io::{Stdout, stdout};
use termion::{
    self,
    raw::{IntoRawMode, RawTerminal},
};

pub struct Stdio {
    verbosity: Verbosity,
    raw_mode: Option<RawTerminal<Stdout>>,
}

impl Stdio {
    pub fn new() -> Self {
        Self {
            verbosity: Verbosity::new(false, false),
            raw_mode: None,
        }
    }
}

impl Console for Stdio {
    fn get_verbosity(&mut self) -> Verbosity {
        self.verbosity
    }

    fn set_verbosity(&mut self, verbosity: Verbosity) {
        self.verbosity = verbosity;
    }

    fn debug(&mut self, msg: &str) {
        if self.verbosity.is_verbose() {
            println!("{msg}");
        }
    }

    fn info(&mut self, msg: &str) {
        if !self.verbosity.is_quiet() {
            println!("{msg}");
        }
    }

    fn error(&mut self, msg: &str) {
        eprintln!("{msg}");
    }

    fn get_geometry(&self) -> Option<(u32, u32)> {
        termion::terminal_size()
            .map(|(w, h)| (w as u32, h as u32))
            .ok()
    }

    fn raw_mode(&mut self) {
        if self.raw_mode.is_none() {
            self.raw_mode = stdout().into_raw_mode().ok();
        }
    }

    fn reset(&mut self) {
        if let Some(raw) = &mut self.raw_mode {
            raw.suspend_raw_mode().ok();
        }
    }
}