yac
/
coreutils
Archived
2
0
Fork 0
This repository has been archived on 2024-01-01. You can view files and clone it, but cannot push or open issues or pull requests.
coreutils/src/cat.rs

73 lines
1.6 KiB
Rust

// Copyright (c) 2022 Emma Tebibyte
// SPDX-License-Identifier: AGPL-3.0-or-later
use std::env;
use std::fs::{File, read_to_string};
use std::io;
use std::io::{ BufRead, Write };
use std::os::unix::io::FromRawFd;
use arg::Args;
use sysexits::ExitCode;
#[derive(Args, Debug)]
struct Arguments {
#[arg(short = "u")]
u: bool,
paths: Vec<String>,
}
fn main() -> ExitCode {
let mut arguments = env::args().collect::<Vec<String>>();
let argv0 = arguments.remove(0);
let args = Arguments::from_args(arguments
.iter()
.map(String::as_str)
.collect::<Vec<&str>>()
).unwrap();
let mut val = String::new();
let mut output = String::new();
if args.paths.is_empty() {
match io::stdin().lock().read_line(&mut output) {
Ok(_) => { val.push_str(&output); },
Err(_) => {
eprintln!("Usage: {} [options...] [files...]", argv0);
return ExitCode::Usage;
},
};
} else {
for path in args.paths {
match read_to_string(&path) {
Ok(output) => { val.push_str(&output); },
Err(_) => {
eprintln!("{}: {}: No such file or directory.", argv0, &path);
return ExitCode::NoInput;
},
};
}
}
if args.u {
let mut stdout = unsafe { File::from_raw_fd(1) };
match stdout.write_all(&val.as_bytes()) {
Ok(_) => {},
Err(_) => {
eprintln!("{}: Cannot write to stdout", argv0);
return ExitCode::OsErr;
},
};
} else { print!("{}", &val); }
match io::stdout().flush() {
Ok(_) => return ExitCode::Ok,
Err(_) => {
eprintln!("{}: Cannot write to stdout", argv0);
return ExitCode::OsErr;
},
};
}