From 692ee4d9a7f8e5d12edb156c4dbb9dd1ee63066f Mon Sep 17 00:00:00 2001 From: Simon Guest Date: Fri, 18 Oct 2024 16:58:55 +1300 Subject: [PATCH] Also export shellvars --- src/main.rs | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/src/main.rs b/src/main.rs index f7c4564..7bf8bcc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,7 +11,7 @@ use once_cell::sync::OnceCell; use serde::{Deserialize, Serialize}; use shellexpand::tilde; use std::{ - collections::HashMap, + collections::{HashMap, HashSet}, concat, env, fs, io::Write, os::unix::fs::PermissionsExt, @@ -189,16 +189,19 @@ fn bash_env( .with_context(|| "stderr.write_all()")?; } - let result: BashEnvResult = - serde_json::from_str(out.as_ref().unwrap()).with_context(|| "serde_json::from_reader()")?; + let BashEnvResult { + env, + shellvars, + error, + } = serde_json::from_str(out.as_ref().unwrap()).with_context(|| "serde_json::from_reader()")?; - if let Some(msg) = &result.error { + if let Some(msg) = error { Err(anyhow!(msg.clone())) - } else if let (Some(env), Some(shellvars)) = (&result.env, &result.shellvars) { + } else if let (Some(env), Some(shellvars)) = (env, shellvars) { Ok(create_record( env, shellvars, - &export, + export, input_span, creation_site_span, )) @@ -208,15 +211,26 @@ fn bash_env( } fn create_record( - env: &HashMap, - _shellvars: &HashMap, - _export: &[String], + env: HashMap, + shellvars: HashMap, + export: Vec, input_span: Span, creation_site_span: Span, ) -> Value { - let cols = env.iter().map(|(k, _v)| k.clone()).collect::>(); + let export: HashSet<_> = export.iter().collect(); + let exported_shellvars = shellvars + .into_iter() + .filter(|(k, _v)| export.contains(k)) + // .map(|(k, v)| (k.clone(), v.clone())) + .collect::>(); + let cols = env + .iter() + .chain(exported_shellvars.iter()) + .map(|(k, _v)| k.clone()) + .collect::>(); let vals = env .iter() + .chain(exported_shellvars.iter()) .map(|(_k, v)| Value::string(v.clone(), Span::unknown())) .collect::>(); Value::record(