kxio 3.2.0

Provides injectable Filesystem and Network resources to make code more testable
Documentation
#[macro_export]
macro_rules! kxprintln {
    ($printer:expr, $($arg:tt)*) => {{
        $crate::print::Print::println_fmt(&$printer.clone(), format_args!($($arg)*))
    }};
}

#[macro_export]
macro_rules! kxprint {
    ($printer:expr, $($arg:tt)*) => {{
        $crate::print::Print::print_fmt(&$printer.clone(), format_args!($($arg)*))
    }};
}

#[macro_export]
macro_rules! kxeprintln {
    ($printer:expr, $($arg:tt)*) => {{
        $crate::print::Print::eprintln_fmt(&$printer.clone(), format_args!($($arg)*))
    }};
}

#[macro_export]
macro_rules! kxeprint {
    ($printer:expr, $($arg:tt)*) => {{
        $crate::print::Print::eprint_fmt(&$printer.clone(), format_args!($($arg)*))
    }};
}

#[cfg(test)]
mod tests {
    use super::super::TestPrint;

    #[test]
    fn test_macro_with_ref_and_owned() {
        // Test with reference
        let printer = TestPrint::new();
        kxprintln!(&printer, "ref test");
        assert_eq!(printer.output(), "ref test\n");
        printer.clear();

        // Test with owned value
        kxprintln!(printer, "owned test");
        assert_eq!(printer.output(), "owned test\n");
    }

    #[test]
    fn test_kxprint_macro() {
        let printer = TestPrint::new();
        kxprint!(printer, "Hello {}", "world");
        assert_eq!(printer.output(), "Hello world");
    }

    #[test]
    fn test_kxprintln_macro() {
        let printer = TestPrint::new();
        kxprintln!(printer, "Hello {}", "world");
        assert_eq!(printer.output(), "Hello world\n");
    }

    #[test]
    fn test_kxeprint_macro() {
        let printer = TestPrint::new();
        kxeprint!(printer, "Error: {}", "file not found");
        assert_eq!(printer.stderr(), "Error: file not found");
    }

    #[test]
    fn test_kxeprintln_macro() {
        let printer = TestPrint::new();
        kxeprintln!(printer, "Error: {}", "permission denied");
        assert_eq!(printer.stderr(), "Error: permission denied\n");
    }
}