diff options
Diffstat (limited to 'src/poem/anthology/export.rs')
-rw-r--r-- | src/poem/anthology/export.rs | 47 |
1 files changed, 37 insertions, 10 deletions
diff --git a/src/poem/anthology/export.rs b/src/poem/anthology/export.rs index aa5a894..35a24ae 100644 --- a/src/poem/anthology/export.rs +++ b/src/poem/anthology/export.rs @@ -1,6 +1,7 @@ -use crate::poem::Verse; use std::collections::BTreeMap; use std::env; +use std::os::unix::process::ExitStatusExt; +use std::process::{ExitStatus, Output}; /// export /// @@ -15,8 +16,11 @@ use std::env; /// ```sh /// export FOO=BAR /// ``` -pub fn incant(verse: &Verse) -> i32 { - match verse.clause() { +pub fn incant(clause: &Option<Vec<String>>, uout: bool) -> Output { + let status = 0; + let mut out: Vec<u8> = Vec::new(); + let err: Vec<u8> = Vec::new(); + match clause { Some(clause) => { for stanza in clause { let (key, val) = match stanza.split_once("=") { @@ -27,14 +31,25 @@ pub fn incant(verse: &Verse) -> i32 { } } None => { + let mut lines = Vec::new(); let sorted: BTreeMap<_, _> = env::vars().into_iter().collect(); for (key, val) in sorted { - println!("{}={}", key, val); + lines.push(format!("{}={}", key, val)); + } + + if uout { + out.append(&mut format!("{}\n", lines.join("\n")).as_bytes().to_vec()); + } else { + println!("{}", lines.join("\n")); } } } - 0 + Output { + status: ExitStatus::from_raw(status), + stdout: out, + stderr: err, + } } /// unset @@ -47,17 +62,29 @@ pub fn incant(verse: &Verse) -> i32 { /// ```sh /// unset FOO /// ``` -pub fn unincant(verse: &Verse) -> i32 { - match verse.clause() { +pub fn unincant(clause: &Option<Vec<String>>, uerr: bool) -> Output { + let mut status = 0; + let out: Vec<u8> = Vec::new(); + let mut err: Vec<u8> = Vec::new(); + match clause { Some(clause) => { for stanza in clause { env::remove_var(stanza); } } None => { - eprintln!("unset: not enough arguments"); - return 1; + status = 1; + if uerr { + err.append(&mut "unset: not enough arguments\n".as_bytes().to_vec()); + } else { + eprintln!("unset: not enough arguments"); + } } } - 0 + + Output { + status: ExitStatus::from_raw(status), + stdout: out, + stderr: err, + } } |