feat(users/Profpatsch/netencode): add env-splice-record

It’s the inverse of record-splice-env! It sucks up the environment and
prints it as a netencode dict! Only the utf-8 clean parts at least.

Change-Id: I96c19fc5ea3a67a23e238f15f4d0fa783081859c
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2527
Tested-by: BuildkiteCI
Reviewed-by: Profpatsch <mail@profpatsch.de>
This commit is contained in:
Profpatsch 2021-02-13 23:13:20 +01:00
parent 5156da542b
commit 9d7c3ee877
2 changed files with 37 additions and 8 deletions

View file

@ -86,12 +86,39 @@ let
}
'';
env-splice-record = imports.writers.rustSimple {
name = "env-splice-record";
dependencies = [
netencode-rs
depot.users.Profpatsch.execline.exec-helpers
];
} ''
extern crate netencode;
extern crate exec_helpers;
use netencode::{T};
use std::os::unix::ffi::OsStringExt;
fn main() {
exec_helpers::no_args("env-splice-record");
let mut res = std::collections::HashMap::new();
for (key, val) in std::env::vars_os() {
match (String::from_utf8(key.into_vec()), String::from_utf8(val.into_vec())) {
(Ok(k), Ok(v)) => { let _ = res.insert(k, T::Text(v)); },
// same as in record-splice-env, we ignore non-utf8 variables
(_, _) => {},
}
}
netencode::encode(&mut std::io::stdout(), &T::Record(res).to_u()).unwrap()
}
'';
in depot.nix.utils.drvTargets {
inherit
netencode-rs
netencode-mustache
record-get
record-splice-env
gen
;
netencode-rs
netencode-mustache
record-get
record-splice-env
env-splice-record
gen
;
}

View file

@ -26,6 +26,7 @@ pub enum T {
Binary(Vec<u8>),
// Tags
// TODO: make into &str
// TODO: rename to Tag
Sum(Tag<String, T>),
// TODO: make into &str
Record(HashMap<String, T>),
@ -81,9 +82,10 @@ pub enum U<'a> {
// Text
Text(&'a str),
Binary(&'a [u8]),
// Tags
// TODO: the U-recursion we do here means we cant be breadth-lazy anymore
// like we originally planned; maybe we want to go `U<'a>` → `&'a [u8]` again?
// Tags
// TODO: rename to Tag
Sum(Tag<&'a str, U<'a>>),
Record(HashMap<&'a str, U<'a>>),
List(Vec<U<'a>>),
@ -195,7 +197,7 @@ pub fn u_from_stdin_or_die_user_error<'a>(prog_name: &'_ str, stdin_buf: &'a mut
let u = match parse::u_u(stdin_buf) {
Ok((rest, u)) => match rest {
b"" => u,
_ => exec_helpers::die_user_error(prog_name, format!("stdin contained some soup after netencode value: {:?}", rest))
_ => exec_helpers::die_user_error(prog_name, format!("stdin contained some soup after netencode value: {:?}", String::from_utf8_lossy(rest)))
},
Err(err) => exec_helpers::die_user_error(prog_name, format!("unable to parse netencode from stdin: {:?}", err))
};