pickup 0.1.1

A CLI tool that helps you remember to buy things
Documentation
use std::io;
use std::io::Write;

pub trait Print {
    fn print(&mut self, text: &str) -> io::Result<()>;
    fn println(&mut self, text: &str) -> io::Result<()>;
}

pub struct Printer<W> {
    writer: W,
}

impl<W: Write> Printer<W> {
    pub fn new(writer: W) -> Self {
        Printer { writer }
    }
}

impl<W: Write> Print for Printer<W> {
    fn print(&mut self, text: &str) -> io::Result<()> {
        write!(self.writer, "{}", text);
        self.writer.flush()?;

        Ok(())
    }

    fn println(&mut self, text: &str) -> io::Result<()> {
        writeln!(self.writer, "{}", text)
    }
}

mod test {
    use super::{Print, Printer};

    #[test]
    fn write_works() {
        let txt = "Make some noise!";
        let mut writer = Vec::new();
        let mut printer = Printer::new(&mut writer);

        let result = printer.print(txt);
        assert!(result.is_ok());

        let actual = String::from_utf8(writer.clone()).expect("not utf8");
        let expected = txt;

        assert_eq!(actual, expected);
    }

    #[test]
    fn writeln_works() {
        let txt = "Make some noise!";
        let mut writer = Vec::new();
        let mut printer = Printer::new(&mut writer);

        let result = printer.println(txt);
        assert!(result.is_ok());

        let actual = String::from_utf8(writer.clone()).expect("not utf8");
        let expected = format!("{}\n", txt);

        assert_eq!(actual, expected);
    }
}