use std::ops::Range;
use crate::enums::IPCMessageProtocol;
use crate::traits::stream_buffer::StreamBuffer;
pub struct IPCFrame<'a> {
pub meta: &'a [u8],
pub body: &'a [u8],
pub protocol: IPCMessageProtocol,
pub is_first: bool,
pub is_last: bool,
pub footer_bytes: Option<&'a [u8]>,
}
pub enum IPCFrameHeader {
NeedMore,
EndOfStream { consumed: usize },
Complete {
frame: ArrowIPCFrameRanges,
consumed: usize,
},
BodyPending {
message_range: std::ops::Range<usize>,
header_consumed: usize,
body_len: usize,
body_pad: usize,
},
}
pub enum IPCFrameResult {
Schema,
Dictionary,
Batch(minarrow::Table),
EndOfStream,
}
#[derive(Debug, Clone)]
pub struct ArrowIPCFrameRanges {
pub message_range: Range<usize>,
pub body_range: Range<usize>,
}
#[derive(Debug)]
pub struct ArrowIPCMessage<B: StreamBuffer> {
pub message: B,
pub body: B,
}
#[derive(Default)]
pub struct IPCFrameMetadata {
pub header_len: usize,
pub meta_len: usize,
pub meta_pad: usize,
pub body_len: usize,
pub body_pad: usize,
pub eos_len: usize,
pub footer_len: usize,
pub magic_len: usize,
}
impl IPCFrameMetadata {
pub fn frame_len(&self) -> usize {
self.header_len
+ self.metadata_total_len()
+ self.body_total_len()
+ self.footer_eos_len()
+ self.magic_len
}
pub fn metadata_total_len(&self) -> usize {
self.meta_len + self.meta_pad
}
pub fn body_total_len(&self) -> usize {
self.body_len + self.body_pad
}
pub fn footer_eos_len(&self) -> usize {
self.eos_len + self.footer_len
}
}