use std::os::fd;
use dope_sys::{
Errno,
io::{
fd::Fd,
file,
reactor::complete::{Decode, Outcome as _},
},
};
use o3::base::num::bounded;
use crate::{
Uring,
reactor::cq::{Invalid, Outcome},
};
unsafe impl file::raw::Completion for Uring {
type Outcome = Outcome;
type Invalid = Invalid;
unsafe fn open(raw: Self::Outcome) -> Result<file::Opened, Self::Invalid> {
match raw.decode() {
Decode::Value(value) => {
let value: bounded::U32<0, { i32::MAX as u32 }> = value.into();
let owned =
unsafe { <fd::OwnedFd as fd::FromRawFd>::from_raw_fd(value.get() as i32) };
Ok(Ok(owned))
}
Decode::Error(code) => Ok(Err(code)),
Decode::Invalid(invalid) => Err(invalid),
}
}
fn close(file: fd::OwnedFd) -> Result<(), Errno> {
<Uring as Fd>::close(file)
}
}