//! The trait implemented by console structures.

use core::fmt;

/// Trait allowing a structure to be used as a console.
pub trait Console: Write {}

/// Trait allowing to write to an object.
pub trait Write {
    /// Write a single character.
    fn write_char(&self, c: char);

    /// Write a Rust format string.
    fn write_fmt(&self, args: fmt::Arguments) -> fmt::Result;

    /// Block until the last buffered character has been consumed.
    fn flush(&self);
}

/// A Dummy Console.
///
/// The DummyConsole implement the [`Console`] trait, and do nothing.
pub struct DummyConsole;

impl Write for DummyConsole {
    fn write_char(&self, _c: char) {}

    fn write_fmt(&self, _args: fmt::Arguments) -> fmt::Result {
        Ok(())
    }

    fn flush(&self) {}
}

impl Console for DummyConsole {}
