use std::borrow::Cow;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Carriage {
Envelope,
Bare,
}
#[must_use]
pub fn open(payload: &[u8]) -> (Cow<'_, [u8]>, Carriage) {
match vta_sdk::tsp_binding::open_envelope(payload) {
Ok(document) => (Cow::Owned(document), Carriage::Envelope),
Err(_) => (Cow::Borrowed(payload), Carriage::Bare),
}
}
#[must_use]
pub fn frame(document: Vec<u8>, carriage: Carriage) -> Vec<u8> {
match carriage {
Carriage::Envelope => vta_sdk::tsp_binding::wrap_envelope(&document),
Carriage::Bare => document,
}
}
#[cfg(test)]
mod tests {
use super::*;
const DOC: &[u8] = br#"{"id":"urn:uuid:1","type":"https://trusttasks.org/spec/messaging/ping/0.1","payload":{}}"#;
#[test]
fn an_envelope_is_opened_to_the_document_it_carries() {
let wire = vta_sdk::tsp_binding::wrap_envelope(DOC);
let (document, carriage) = open(&wire);
assert_eq!(carriage, Carriage::Envelope);
assert_eq!(
serde_json::from_slice::<serde_json::Value>(&document).unwrap(),
serde_json::from_slice::<serde_json::Value>(DOC).unwrap(),
);
}
#[test]
fn a_bare_document_is_passed_through_as_bare() {
let (document, carriage) = open(DOC);
assert_eq!(carriage, Carriage::Bare);
assert_eq!(&*document, DOC);
}
#[test]
fn a_reply_is_framed_the_way_the_request_arrived() {
let wrapped = frame(DOC.to_vec(), Carriage::Envelope);
assert_ne!(wrapped, DOC, "an envelope reply is wrapped");
assert_eq!(
serde_json::from_slice::<serde_json::Value>(
&vta_sdk::tsp_binding::open_envelope(&wrapped).unwrap()
)
.unwrap(),
serde_json::from_slice::<serde_json::Value>(DOC).unwrap(),
);
assert_eq!(frame(DOC.to_vec(), Carriage::Bare), DOC, "bare stays bare");
}
#[test]
fn opening_preserves_the_value() {
let opened = vta_sdk::tsp_binding::open_envelope(&frame(DOC.to_vec(), Carriage::Envelope))
.expect("opens");
assert_eq!(
serde_json::from_slice::<serde_json::Value>(&opened).unwrap(),
serde_json::from_slice::<serde_json::Value>(DOC).unwrap(),
);
}
#[test]
fn a_non_json_payload_falls_through_to_the_caller() {
let (document, carriage) = open(b"not json at all");
assert_eq!(carriage, Carriage::Bare);
assert_eq!(&*document, b"not json at all");
}
}