Crates.io | stdio-override |
lib.rs | stdio-override |
version | |
source | src |
created_at | 2019-05-01 19:28:21.730271+00 |
updated_at | 2025-01-26 18:07:31.260171+00 |
description | Rust library for overriding Stdin/Stdout/Stderr with a different stream |
homepage | |
repository | https://github.com/elichai/stdio-override |
max_upload_size | |
id | 131432 |
Cargo.toml error: | TOML parse error at line 18, column 1 | 18 | autolib = false | ^^^^^^^ unknown field `autolib`, expected one of `name`, `version`, `edition`, `authors`, `description`, `readme`, `license`, `repository`, `homepage`, `documentation`, `build`, `resolver`, `links`, `default-run`, `default_dash_run`, `rust-version`, `rust_dash_version`, `rust_version`, `license-file`, `license_dash_file`, `license_file`, `licenseFile`, `license_capital_file`, `forced-target`, `forced_dash_target`, `autobins`, `autotests`, `autoexamples`, `autobenches`, `publish`, `metadata`, `keywords`, `categories`, `exclude`, `include` |
size | 0 |
A Rust library to easily override Stdio streams in Rust. It works on Unix and Windows platforms.
Add this to your Cargo.toml
:
[dependencies]
stdio-override = "0.1"
and for Rust Edition 2015 add this to your crate root:
extern crate stdio_override;
In Rust Edition 2018 you can simply do:
use stdio_override::*;
Here's an example on how to write stdout into a file:
use std::{fs::{read_to_string, remove_file}, io};
use stdio_override::StdoutOverride;
fn main() -> io::Result<()> {
let file_name = "./readme_test.txt";
let guard = StdoutOverride::from_file(file_name)?;
println!("some output");
drop(guard);
let contents = read_to_string(file_name)?;
assert_eq!("some output\n", contents);
println!("Outside!");
remove_file(file_name)?;
Ok(())
}
On Unix(Linux/MacOS etc.) you can also do the same with sockets:
use std::{
io::Read,
net::{TcpListener, TcpStream},
};
use stdio_override::StdoutOverride;
#[cfg(unix)]
fn main() {
let address = ("127.0.0.1", 5543);
let listener = TcpListener::bind(address).unwrap();
let socket = TcpStream::connect(address).unwrap();
let guard = StdoutOverride::from_io(socket).unwrap();
println!("12345");
drop(guard);
let mut contents = String::new();
let (mut stream, _) = listener.accept().unwrap();
stream.read_to_string(&mut contents).unwrap();
assert_eq!("12345\n", contents);
println!("Outside!");
}
#[cfg(not(unix))]
fn main() {}
Both will work the same for Stderr
and if you want to input Stdin
from a file/socket you can do the following:
use std::{fs::File, io::{self, Write}};
use stdio_override::StdinOverride;
fn main() -> io::Result<()> {
let file_name = "./test_inputs.txt";
{
let mut file = File::create(&file_name)?;
file.write_all(b"Data")?;
}
let guard = StdinOverride::from_file(file_name)?;
let mut inputs = String::new();
io::stdin().read_line(&mut inputs)?;
drop(guard);
assert_eq!("Data", inputs);
// Stdin is working as usual again, because the guard is dropped.
Ok(())
}