///|
pub struct Header {
timestamp : UInt
kind : Int
subtype : Int
length : Int
} derive(Eq, ToJson)
///|
pub extend Header with Eq::{equal, not_equal}
///|
pub extend Header with ToJson::{to_json}
///|
pub struct Frame {
header : Header
microseconds : Int?
payload : Bytes
} derive(Eq)
///|
pub extend Frame with Eq::{equal, not_equal}
///|
/// 单条记录上限为 16 MiB,未知类型仍保留完整记录。
pub fn read_frame(data : Bytes) -> Frame raise ParseError {
let c = Cursor::new(data)
let timestamp = c.u32()
let kind = c.u16()
let subtype = c.u16()
let size = c.u32()
if size > 16777216U {
raise Invalid(8, "MRT 记录超过 16 MiB 上限")
}
let length = size.reinterpret_as_int()
let body = c.take(length)
c.finish()
let microseconds = if kind == 17 || kind == 33 || kind == 49 {
let micros = body.u32()
if micros >= 1000000U {
raise Invalid(12, "微秒字段超出范围")
}
Some(micros.reinterpret_as_int())
} else {
None
}
let payload = body.bytes(body.remaining())
{ header: { timestamp, kind, subtype, length, }, microseconds, payload, }
}