byte go write
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..88f7dcd
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,54 @@
+use comat::comat;
+use std::{io::ErrorKind, process::ExitCode};
+
+macro_rules! fail {
+ () => {
+ fail!("[$($x:u8),+ $(,)?] <outfile>")
+ };
+ ($usage:literal) => {{
+ eprintln!(concat!("usage: wrat ", comat!($usage)));
+ return ExitCode::FAILURE;
+ }};
+}
+fn main() -> ExitCode {
+ let mut args = std::env::args().skip(1);
+ let first = args.next();
+ let Some(Some(first)) = first.map(|x| x.strip_prefix('[').map(ToOwned::to_owned)) else {
+ fail!()
+ };
+ let Ok(n) = first.trim_end_matches(',').parse::<u8>() else {
+ fail!("[{red}u8{reset}]");
+ };
+
+ let mut dat = Vec::with_capacity(64);
+ dat.push(n);
+ loop {
+ let Some(x) = args.next() else {
+ fail!("[{red}u8{reset}]")
+ };
+ let Ok(n) = x.trim_end_matches(',').trim_end_matches(']').parse::<u8>() else {
+ fail!("[{red}u8{reset}]");
+ };
+ dat.push(n);
+ match x.strip_suffix(']') {
+ Some(_) => break,
+ None => continue,
+ }
+ }
+ let Some(out) = args.next() else {
+ fail!("[..] <{red}filename{reset}>")
+ };
+ match std::fs::write(out, dat).map_err(|e| e.kind()) {
+ Ok(()) => {}
+ Err(ErrorKind::PermissionDenied) => {
+ fail!("[..] <{red}accessible filename{reset}>")
+ }
+ Err(ErrorKind::NotFound) => {
+ fail!("[..] <{red}valid filename{reset}>")
+ }
+ Err(_) => {
+ fail!("[..] <{red}writable file{reset}>")
+ }
+ }
+ ExitCode::SUCCESS
+}