use std::io;
use crate::operation::{tracker::BufferOwnership, Completed, Operation, OperationType};
use std::os::unix::io::RawFd;
#[derive(Debug)]
pub struct CompletionResult<'ring, 'buf> {
pub(super) operation: Option<Operation<'ring, 'buf, Completed<io::Result<i32>>>>,
pub(super) operation_id: u64,
pub(super) op_type: OperationType,
pub(super) fd: RawFd,
pub(super) result: io::Result<i32>,
pub(super) buffer: Option<BufferOwnership>,
}
impl<'ring, 'buf> CompletionResult<'ring, 'buf> {
#[allow(dead_code)] pub(super) fn new(
operation: Operation<'ring, 'buf, Completed<io::Result<i32>>>,
operation_id: u64,
) -> Self {
let op_type = operation.op_type();
let fd = operation.fd();
let result = match operation.result() {
Ok(bytes) => Ok(*bytes),
Err(e) => Err(io::Error::new(e.kind(), e.to_string())),
};
Self {
operation: Some(operation),
operation_id,
op_type,
fd,
result,
buffer: None,
}
}
pub(crate) fn new_with_buffer(
operation_id: u64,
op_type: OperationType,
fd: RawFd,
result: io::Result<i32>,
buffer: Option<BufferOwnership>,
) -> Self {
Self {
operation: None,
operation_id,
op_type,
fd,
result,
buffer,
}
}
pub fn into_result(self) -> (io::Result<i32>, Option<BufferOwnership>) {
(self.result, self.buffer)
}
#[inline]
pub fn result(&self) -> &io::Result<i32> {
if let Some(ref operation) = self.operation {
operation.result()
} else {
&self.result
}
}
#[inline]
pub fn id(&self) -> u64 {
self.operation_id
}
#[inline]
pub fn fd(&self) -> std::os::unix::io::RawFd {
if let Some(ref operation) = self.operation {
operation.fd()
} else {
self.fd
}
}
#[inline]
pub fn op_type(&self) -> crate::operation::OperationType {
if let Some(ref operation) = self.operation {
operation.op_type()
} else {
self.op_type
}
}
#[inline]
pub fn has_buffer(&self) -> bool {
if let Some(ref operation) = self.operation {
operation.has_buffer()
} else {
self.buffer.is_some()
}
}
#[inline]
pub fn is_success(&self) -> bool {
self.result().is_ok()
}
#[inline]
pub fn bytes_transferred(&self) -> Option<i32> {
match self.result() {
Ok(bytes) => Some(*bytes),
Err(_) => None,
}
}
}