Change-Id: Ib1714abce2815873eb50dbeac088e812fa9098ab Reviewed-on: https://cl.tvl.fyi/c/depot/+/8686 Tested-by: BuildkiteCI Reviewed-by: Profpatsch <mail@profpatsch.de> Autosubmit: Profpatsch <mail@profpatsch.de>
		
			
				
	
	
		
			81 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{ depot, pkgs, lib, ... }:
 | 
						|
 | 
						|
let
 | 
						|
 | 
						|
  # Add the given nix arguments to the program as ARGLIB_NETENCODE envvar
 | 
						|
  #
 | 
						|
  # Calls `netencode.gen.dwim` on the provided nix args value.
 | 
						|
  with-args = name: args: prog: depot.nix.writeExecline "${name}-with-args" { } [
 | 
						|
    "export"
 | 
						|
    "ARGLIB_NETENCODE"
 | 
						|
    (depot.users.Profpatsch.netencode.gen.dwim args)
 | 
						|
    prog
 | 
						|
  ];
 | 
						|
 | 
						|
  rust = depot.nix.writers.rustSimpleLib
 | 
						|
    {
 | 
						|
      name = "arglib-netencode";
 | 
						|
      dependencies = [
 | 
						|
        depot.users.Profpatsch.execline.exec-helpers
 | 
						|
        depot.users.Profpatsch.netencode.netencode-rs
 | 
						|
      ];
 | 
						|
    } ''
 | 
						|
    extern crate netencode;
 | 
						|
    extern crate exec_helpers;
 | 
						|
 | 
						|
    use netencode::{T};
 | 
						|
    use std::os::unix::ffi::OsStrExt;
 | 
						|
 | 
						|
    pub fn arglib_netencode(prog_name: &str, env: Option<&std::ffi::OsStr>) -> T {
 | 
						|
        let env = match env {
 | 
						|
            None => std::ffi::OsStr::from_bytes("ARGLIB_NETENCODE".as_bytes()),
 | 
						|
            Some(a) => a
 | 
						|
        };
 | 
						|
        let t = match std::env::var_os(env) {
 | 
						|
            None => exec_helpers::die_user_error(prog_name, format!("could not read args, envvar {} not set", env.to_string_lossy())),
 | 
						|
            // TODO: good error handling for the different parser errors
 | 
						|
            Some(soup) => match netencode::parse::t_t(soup.as_bytes()) {
 | 
						|
                Ok((remainder, t)) => match remainder.is_empty() {
 | 
						|
                    true => t,
 | 
						|
                    false => exec_helpers::die_environment_problem(prog_name, format!("arglib: there was some unparsed bytes remaining: {:?}", remainder))
 | 
						|
                },
 | 
						|
                Err(err) => exec_helpers::die_environment_problem(prog_name, format!("arglib parsing error: {:?}", err))
 | 
						|
            }
 | 
						|
        };
 | 
						|
        std::env::remove_var(env);
 | 
						|
        t
 | 
						|
    }
 | 
						|
  '';
 | 
						|
 | 
						|
  haskell = pkgs.haskellPackages.mkDerivation {
 | 
						|
    pname = "arglib-netencode";
 | 
						|
    version = "0.1.0";
 | 
						|
 | 
						|
    src = depot.users.Profpatsch.exactSource ./. [
 | 
						|
      ./arglib-netencode.cabal
 | 
						|
      ./ArglibNetencode.hs
 | 
						|
    ];
 | 
						|
 | 
						|
    libraryHaskellDepends = [
 | 
						|
      pkgs.haskellPackages.pa-prelude
 | 
						|
      pkgs.haskellPackages.pa-label
 | 
						|
      pkgs.haskellPackages.pa-error-tree
 | 
						|
      depot.users.Profpatsch.netencode.netencode-hs
 | 
						|
      depot.users.Profpatsch.execline.exec-helpers-hs
 | 
						|
    ];
 | 
						|
 | 
						|
    isLibrary = true;
 | 
						|
    license = lib.licenses.mit;
 | 
						|
 | 
						|
 | 
						|
  };
 | 
						|
 | 
						|
 | 
						|
in
 | 
						|
depot.nix.readTree.drvTargets {
 | 
						|
  inherit
 | 
						|
    with-args
 | 
						|
    rust
 | 
						|
    haskell
 | 
						|
    ;
 | 
						|
}
 |