Implement ExitCodeExt for Windows · Issue #48 · rust-lang/libs-team (original) (raw)

Proposal

Problem statement

On Windows it is common for applications to return HRESULT (i32) or DWORD (u32) values. The newly stabilized ExitCode provides an excellent fit for propagating these values, because std::process::exit exits immediately and does not run deconstructors which can result in errors. However, ExitCode currently only implements From<u8> for ExitCode, which disallows the full range of i32/u32 values. This proposal attempts to address that shortcoming by providing windows specific extensions that accept a u32 value (which covers all possible HRESULTS and Win32 errors) analog to ExitStatusExt::from_raw.

Motivation, use-cases

Solution sketches

/// Windows-specific extensions to [process::ExitCode]. /// /// This trait is sealed: it cannot be implemented outside the standard library. /// This is so that future additional methods are not breaking changes. #[stable(feature = "windows_process_exit_code_from", since = "1.63.0")] pub trait ExitCodeExt: Sealed { /// Creates a new ExitCode from the raw underlying u32 return value of /// a process. /// /// The exit code should not be 259, as this conflicts with the STILL_ACTIVE /// macro returned from the GetExitCodeProcess function to signal that the /// process has yet to run to completion. #[stable(feature = "windows_process_exit_code_from", since = "1.63.0")] fn from_raw(raw: u32) -> Self; }

#[stable(feature = "windows_process_exit_code_from", since = "1.63.0")] impl ExitCodeExt for process::ExitCode { fn from_raw(raw: u32) -> Self { process::ExitCode::from_inner(From::from(raw)) } }

Original suggestion
Implementation