self-runas 0.1.0

run this application with sudo/as admin
Documentation
use runas_with_inherited_cmd as runas;

pub fn admin() -> anyhow::Result<()> {
    let mut binding = runas::Command::new(std::env::current_exe()?);
    let mut cmd = binding
        .args(std::env::args().skip(1).collect::<Vec<_>>().as_slice());


    
    #[cfg(target_os = "windows")]
    let show_flag = true;
    #[cfg(not(target_os = "windows"))]
    let show_flag = false;
    cmd = cmd.show(show_flag);
    
    match cmd.status()
    {
        Ok(_) => Ok(()),
        Err(_) => anyhow::bail!("failed"),
    }
}

#[cfg(windows)]
pub fn is_elevated() -> bool {
    use winapi::shared::minwindef::DWORD;
    use winapi::um::handleapi::CloseHandle;
    use winapi::um::processthreadsapi::{GetCurrentProcess, OpenProcessToken};
    use winapi::um::securitybaseapi::GetTokenInformation;
    use winapi::um::winnt::{TOKEN_ELEVATION, TOKEN_QUERY, TokenElevation};

    unsafe {
        let process = GetCurrentProcess();
        let mut token = std::ptr::null_mut();
        if OpenProcessToken(process, TOKEN_QUERY, &mut token) == 0 {
            return false;
        }
        let mut elev: TOKEN_ELEVATION = std::mem::zeroed();
        let mut ret_len: DWORD = 0;
        let ok = GetTokenInformation(
            token,
            TokenElevation,
            &mut elev as *mut _ as *mut _,
            std::mem::size_of::<TOKEN_ELEVATION>() as DWORD,
            &mut ret_len,
        );
        CloseHandle(token);
        if ok == 0 {
            return false;
        }
        elev.TokenIsElevated != 0
    }
}

#[cfg(unix)]
pub fn is_elevated() -> bool {
    nix::unistd::geteuid().is_root()
}