Add printenv
This commit is contained in:
parent
32f2f66c7d
commit
e7b84e6e13
4 changed files with 76 additions and 1 deletions
|
@ -7,6 +7,10 @@ edition = "2021"
|
|||
name = "echo"
|
||||
path = "src/echo.rs"
|
||||
|
||||
[[bin]]
|
||||
name = "printenv"
|
||||
path = "src/printenv.rs"
|
||||
|
||||
[dependencies]
|
||||
aho-corasick = "1.1.3"
|
||||
clap = { version = "4.5.20", features = ["derive"] }
|
||||
|
|
|
@ -4,5 +4,5 @@ Implementation of some of the Unix command line utils
|
|||
|
||||
Currently implemented:
|
||||
```
|
||||
echo
|
||||
echo, printenv
|
||||
```
|
43
src/printenv.rs
Normal file
43
src/printenv.rs
Normal file
|
@ -0,0 +1,43 @@
|
|||
#![feature(iter_intersperse)]
|
||||
|
||||
use std::io::Write;
|
||||
|
||||
use clap::Parser;
|
||||
|
||||
/// Utility command to output information
|
||||
#[derive(Parser, Debug)]
|
||||
#[command(version, about, long_about = None)]
|
||||
struct Args {
|
||||
/// End each output line with NUL instead of newline
|
||||
#[arg(short='0', long)]
|
||||
null: bool,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let args = Args::parse();
|
||||
|
||||
let mut list: Vec<String> = vec![];
|
||||
for (k, v) in std::env::vars() {
|
||||
list.push(format!("{k}={v}"));
|
||||
}
|
||||
|
||||
let mut data: String;
|
||||
|
||||
if args.null {
|
||||
data = list.join("\0");
|
||||
data.push('\0');
|
||||
} else {
|
||||
data = list.join("\n");
|
||||
data.push('\n');
|
||||
}
|
||||
|
||||
let mut out = std::io::stdout();
|
||||
|
||||
match out.write_all(data.as_bytes()) {
|
||||
Err(e) => {
|
||||
eprintln!("Failed to write to stdout: {e}");
|
||||
std::process::exit(1);
|
||||
},
|
||||
Ok(()) => ()
|
||||
};
|
||||
}
|
28
tests/printenv.rs
Normal file
28
tests/printenv.rs
Normal file
|
@ -0,0 +1,28 @@
|
|||
use assert_cmd::prelude::*;
|
||||
use predicates::prelude::*;
|
||||
use std::process::Command;
|
||||
|
||||
#[test]
|
||||
fn env_capture() -> Result<(), Box<dyn std::error::Error>> {
|
||||
std::env::set_var("TEST_ABC", "brrrr");
|
||||
let mut cmd = Command::cargo_bin("printenv")?;
|
||||
|
||||
cmd.assert()
|
||||
.success()
|
||||
.stdout(predicate::str::contains("TEST_ABC=brrrr\n"));
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn null_replace() -> Result<(), Box<dyn std::error::Error>> {
|
||||
std::env::set_var("TEST_ABC", "brrrr");
|
||||
let mut cmd = Command::cargo_bin("printenv")?;
|
||||
|
||||
cmd.arg("-0");
|
||||
cmd.assert()
|
||||
.success()
|
||||
.stdout(predicate::str::contains("TEST_ABC=brrrr\0"));
|
||||
|
||||
Ok(())
|
||||
}
|
Loading…
Reference in a new issue