tunnels 0.1.0

Dev Tunnels SDK
Documentation
use std::io;

#[cfg(target_os = "windows")]
pub fn get_policy_header_value() -> io::Result<Option<String>> {
    use urlencoding::encode;
    use winreg::enums::*;
    use winreg::RegKey;

    pub const REGISTRY_KEY_PATH: &str = r"Software\Policies\Microsoft\DevTunnels";

    let hklm = RegKey::predef(HKEY_LOCAL_MACHINE);
    let sub_key = match hklm.open_subkey(REGISTRY_KEY_PATH) {
        Ok(sub_key) => sub_key,
        Err(e) if e.kind() == io::ErrorKind::NotFound => return Ok(None),
        Err(e) => return Err(e),
    };

    let mut header_values = vec![];

    for (name, value) in sub_key.enum_values().filter_map(Result::ok) {
        let value_str: String = value.to_string();
        if !value_str.is_empty() {
            header_values.push(format!("{}={}", encode(&name), encode(&value_str)));
        }
    }

    let header = header_values.join("; ");
    if header.is_empty() {
        Ok(None)
    } else {
        Ok(Some(header))
    }
}

#[cfg(not(target_os = "windows"))]
pub fn get_policy_header_value() -> io::Result<Option<String>> {
    Ok(None)
}