use crate::tlv;
use anyhow;
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
#[repr(u8)]
pub enum Status {
Success = 0,
Unexpecteddata = 1,
}
impl Status {
pub fn from_u8(value: u8) -> Option<Self> {
match value {
0 => Some(Status::Success),
1 => Some(Status::Unexpecteddata),
_ => None,
}
}
pub fn to_u8(self) -> u8 {
self as u8
}
}
impl From<Status> for u8 {
fn from(val: Status) -> Self {
val as u8
}
}
pub fn encode_content_app_message(data: String, encoding_hint: String) -> anyhow::Result<Vec<u8>> {
let tlv = tlv::TlvItemEnc {
tag: 0,
value: tlv::TlvItemValueEnc::StructInvisible(vec![
(0, tlv::TlvItemValueEnc::String(data)).into(),
(1, tlv::TlvItemValueEnc::String(encoding_hint)).into(),
]),
};
Ok(tlv.encode()?)
}
#[derive(Debug, serde::Serialize)]
pub struct ContentAppMessageResponse {
pub status: Option<Status>,
pub data: Option<String>,
pub encoding_hint: Option<String>,
}
pub fn decode_content_app_message_response(inp: &tlv::TlvItemValue) -> anyhow::Result<ContentAppMessageResponse> {
if let tlv::TlvItemValue::List(_fields) = inp {
let item = tlv::TlvItem { tag: 0, value: inp.clone() };
Ok(ContentAppMessageResponse {
status: item.get_int(&[0]).and_then(|v| Status::from_u8(v as u8)),
data: item.get_string_owned(&[1]),
encoding_hint: item.get_string_owned(&[2]),
})
} else {
Err(anyhow::anyhow!("Expected struct fields"))
}
}