use super::*; use crate::collections::HashMap; use crate::io::Write; fn create_args_test() -> std::io::Result> { let mut sample_data = vec![]; let mut h = HashMap::new(); h.insert("foo", "bar"); h.insert("baz", "qux"); h.insert("some", "val"); // Magic number sample_data.write_all(&PARAMS_MAGIC)?; // Size of the AppP block sample_data.write_all(&4u32.to_le_bytes())?; // Number of blocks sample_data.write_all(&2u32.to_le_bytes())?; // Magic number sample_data.write_all(&ENV_MAGIC)?; let mut data = vec![]; for (key, value) in h.iter() { data.extend_from_slice(&(key.len() as u16).to_le_bytes()); data.extend_from_slice(key.as_bytes()); data.extend_from_slice(&(value.len() as u16).to_le_bytes()); data.extend_from_slice(value.as_bytes()); } // Size of the EnvB block sample_data.write_all(&(data.len() as u32 + 2).to_le_bytes())?; // Number of environment variables sample_data.write_all(&(h.len() as u16).to_le_bytes())?; // Environment variables sample_data.write_all(&data)?; // Write command line arguments let args = vec!["some", "command", "line variable", "entries"]; sample_data.write_all(&ARGS_MAGIC)?; let mut args_size = 0; for entry in args.iter() { args_size += entry.len() + 2; } sample_data.write_all(&(args_size as u32 + 2).to_le_bytes())?; sample_data.write_all(&(args.len() as u16).to_le_bytes())?; for entry in args { sample_data.write_all(&(entry.len() as u16).to_le_bytes())?; sample_data.write_all(entry.as_bytes())?; } Ok(sample_data) } #[test] fn basic_arg_parsing() { let arg_data = create_args_test().expect("couldn't create test data"); for byte in &arg_data { print!("{:02x} ", byte); } println!(); let args = ApplicationParameters::new(&arg_data).expect("Unable to parse arguments"); for arg in args { if let Ok(env) = EnvironmentBlock::try_from(&arg) { for env in env { println!("{}={}", env.key, env.value); } } else if let Ok(args) = ArgumentList::try_from(&arg) { for arg in args { println!("Arg: {}", arg.value); } } } }