1use std::{
2 io::{Error, Result},
3 time::Duration,
4};
5use windows_sys::Win32::System::Threading::INFINITE;
6
7pub(crate) fn cvt(ret: i32) -> Result<i32> {
8 if ret == 0 {
9 Err(Error::last_os_error())
10 } else {
11 Ok(ret)
12 }
13}
14
15pub(crate) fn dur_to_ms(timeout: Option<Duration>) -> u32 {
16 let func = |dur: Duration| -> u32 {
17 dur.as_secs()
18 .checked_mul(1000)
19 .and_then(|ms| ms.checked_add((dur.subsec_nanos() as u64) / 1_000_000))
20 .and_then(|ms| {
21 ms.checked_add(if dur.subsec_nanos() % 1_000_000 > 0 {
22 1
23 } else {
24 0
25 })
26 })
27 .map(|ms| {
28 if ms > u32::max_value() as u64 {
29 INFINITE
30 } else {
31 ms as u32
32 }
33 })
34 .unwrap_or(INFINITE)
35 };
36
37 timeout.map(func).unwrap_or(INFINITE)
38}
39
40pub(crate) fn len<T>(list: &[T]) -> u32 {
41 list.len().min(u32::MAX as usize) as u32
42}