use alloc::string::String;
use alloc::vec::Vec;
use zerodds_corba_giop::{Message, decode_message};
use zerodds_corba_ior::{Ior, ProfileId};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RequestSummary {
pub request_id: u32,
pub operation: String,
pub body: Vec<u8>,
}
#[must_use]
pub fn decode_giop_request_bytes(frame: &[u8]) -> Option<RequestSummary> {
let (msg, body) = decode_message(frame).ok()?;
match msg {
Message::Request(r) => Some(RequestSummary {
request_id: r.request_id,
operation: r.operation,
body: body.to_vec(),
}),
_ => None,
}
}
#[must_use]
pub fn object_key_from_ior(ior: &Ior) -> Option<Vec<u8>> {
for prof in &ior.profiles {
if prof.tag == ProfileId::InternetIop {
if let Some(Ok(body)) = prof.as_iiop() {
return Some(body.object_key);
}
}
}
None
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn decode_giop_request_bytes_rejects_non_request_frame() {
let bogus = [0u8; 12];
assert!(decode_giop_request_bytes(&bogus).is_none());
}
#[test]
fn object_key_from_empty_ior_is_none() {
let ior = Ior::default();
assert_eq!(object_key_from_ior(&ior), None);
}
}