Skip to content

Commit 98ca585

Browse files
authored
Add unwrap helper for NTSTATUS (#3324)
1 parent 47e2228 commit 98ca585

File tree

3 files changed

+85
-0
lines changed

3 files changed

+85
-0
lines changed

crates/libs/windows/src/extensions/Win32/Foundation/NTSTATUS.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,23 @@ impl NTSTATUS {
55
pub const fn is_ok(self) -> bool {
66
self.0 >= 0
77
}
8+
89
#[inline]
910
pub const fn is_err(self) -> bool {
1011
!self.is_ok()
1112
}
13+
1214
#[inline]
1315
pub const fn to_hresult(self) -> windows_core::HRESULT {
1416
windows_core::HRESULT::from_nt(self.0)
1517
}
18+
19+
#[inline]
20+
#[track_caller]
21+
pub fn unwrap(self) {
22+
assert!(self.is_ok(), "NTSTATUS 0x{:X}", self.0);
23+
}
24+
1625
#[inline]
1726
pub fn ok(self) -> windows_core::Result<()> {
1827
if self.is_ok() {
@@ -22,11 +31,13 @@ impl NTSTATUS {
2231
}
2332
}
2433
}
34+
2535
impl From<NTSTATUS> for windows_core::HRESULT {
2636
fn from(value: NTSTATUS) -> Self {
2737
value.to_hresult()
2838
}
2939
}
40+
3041
impl From<NTSTATUS> for windows_core::Error {
3142
fn from(value: NTSTATUS) -> Self {
3243
value.to_hresult().into()

crates/tests/misc/result/Cargo.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@ publish = false
88
doc = false
99
doctest = false
1010

11+
[dependencies.windows]
12+
workspace = true
13+
features = [
14+
"Win32_Foundation",
15+
]
16+
1117
[dependencies.windows-result]
1218
workspace = true
1319

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
use windows::Win32::Foundation::{NTSTATUS, STATUS_INVALID_ACL, STATUS_SUCCESS, S_OK};
2+
use windows_result::Result as WindowsResult;
3+
use windows_result::HRESULT;
4+
5+
#[test]
6+
fn test() {
7+
assert!(STATUS_SUCCESS.is_ok());
8+
assert!(!STATUS_INVALID_ACL.is_ok());
9+
10+
assert!(!STATUS_SUCCESS.is_err());
11+
assert!(STATUS_INVALID_ACL.is_err());
12+
13+
STATUS_SUCCESS.unwrap();
14+
let result: WindowsResult<()> = STATUS_SUCCESS.ok();
15+
assert!(result.is_ok());
16+
17+
assert_eq!(STATUS_SUCCESS.to_hresult(), S_OK);
18+
19+
// Tests convertibility.
20+
a().unwrap();
21+
b().unwrap();
22+
}
23+
24+
#[test]
25+
#[should_panic(expected = "NTSTATUS 0xC0000077")]
26+
fn test_panic() {
27+
STATUS_INVALID_ACL.unwrap();
28+
}
29+
30+
fn a() -> WindowsResult<()> {
31+
fn a() -> WindowsResult<()> {
32+
Ok(())
33+
}
34+
35+
fn b() -> Result<(), HRESULT> {
36+
Ok(())
37+
}
38+
39+
fn c() -> Result<(), NTSTATUS> {
40+
Ok(())
41+
}
42+
43+
a()?;
44+
b()?;
45+
c()?;
46+
47+
Ok(())
48+
}
49+
50+
fn b() -> Result<(), HRESULT> {
51+
fn a() -> WindowsResult<()> {
52+
Ok(())
53+
}
54+
55+
fn b() -> Result<(), HRESULT> {
56+
Ok(())
57+
}
58+
59+
fn c() -> Result<(), NTSTATUS> {
60+
Ok(())
61+
}
62+
63+
a()?;
64+
b()?;
65+
c()?;
66+
67+
Ok(())
68+
}

0 commit comments

Comments
 (0)