From d20a1da6f85ed83339668bd7c24175a11d7d2f1e Mon Sep 17 00:00:00 2001 From: emma Date: Wed, 27 Dec 2023 15:40:31 -0700 Subject: [PATCH] .editorconfig: fixed utf8 issue --- .editorconfig | 2 +- src/fop.rs | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 src/fop.rs diff --git a/.editorconfig b/.editorconfig index f78e6ef..416f893 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,7 +1,7 @@ root = true [*] -charset = utf8 +charset = utf-8 end_of_line = lf indent_style = tab indent_size = 4 diff --git a/src/fop.rs b/src/fop.rs new file mode 100644 index 0000000..9c25463 --- /dev/null +++ b/src/fop.rs @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2023 Emma Tebibyte + * SPDX-License-Identifier: AGPL-3.0-or-later + * + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU Affero General Public License as published by the Free + * Software Foundation, either version 3 of the License, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more + * details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ + +use std::{ + env::args, + io::{ Read, stdin, Write }, + process::{ Command, exit, Stdio }, +}; + +fn main() { + let argv = args().collect::>(); + + let index = match argv.get(1) { + Some(i) => { + i.parse::().unwrap_or_else(|_| { + eprintln!("{}: {}: Not an integer.", argv[0], i); + exit(1); + }) + }, + None => { + eprintln!("Usage: {} index command args...", argv[0]); + exit(1); + }, + }; + + let mut buf = String::new(); + stdin().read_to_string(&mut buf).unwrap(); + let mut fields = buf.split('␞').collect::>(); + + argv.get(2).unwrap_or_else(|| { + eprintln!("Usage: {} index command args...", argv[0]); + exit(1); + }); + + let opts = argv.iter().clone().skip(3).collect::>(); + + let mut spawned = Command::new(argv.get(2).unwrap()) + .args(opts) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .spawn() + .unwrap(); + + let field = fields.get(index).unwrap_or_else(|| { + eprintln!("{}: {}: No such index in input.", argv[0], index.to_string()); + exit(1); + }); + + if let Some(mut child_stdin) = spawned.stdin.take() { + child_stdin.write_all(field.as_bytes()).unwrap(); + drop(child_stdin); + } + + let output = spawned.wait_with_output().unwrap(); + + let new_field = String::from_utf8(output.stdout).unwrap(); + + fields[index] = &new_field; + + print!("{}", fields.join("␞")); +}