use crate::*;
use bytemuck::Zeroable;
pub fn get_state(user_index: impl TryInto<u32>) -> Result<State, Error> {
fn_context!(xinput::get_state => XInputGetState);
#[allow(non_snake_case)] let XInputGetState = imports::XInputGetState.load(core::sync::atomic::Ordering::Relaxed);
let user_index = user_index.try_into().map_err(|_| fn_param_error!(user_index, error::BAD_ARGUMENTS))?;
let mut state = State::zeroed();
let code = unsafe { XInputGetState(user_index, state.as_mut()) };
check_success!(code)?;
Ok(state)
}
#[test] fn test_valid_params() {
for user_index in 0 .. 4 {
if let Err(err) = get_state(user_index) {
assert!(matches!(err.kind(), error::DEVICE_NOT_CONNECTED | error::CO_E_NOTINITIALIZED), "unexpected error type: {err:?}");
}
}
}
#[test] fn test_bad_user_index() {
for user_index in xuser::invalids().chain(Some(xuser::INDEX_ANY)) {
let err = get_state(user_index).expect_err("expected error for invalid user_index");
assert!(matches!(err.kind(), error::BAD_ARGUMENTS | error::CO_E_NOTINITIALIZED), "unexpected error type: {err:?}");
}
}