use bitvec::order::Msb0;
use serde_json::Value;
use crate::protocol::prelude::common::{
bits::{util::BitReversible, BitDecoder, Frame},
error::Error,
event::{EventDecoder, EventEncoder},
};
pub struct InteractionResponse {
decoder: BitDecoder<Msb0>,
pub request_id: u64,
pub response: Option<Value>,
}
impl InteractionResponse {
pub fn new(decoder: BitDecoder<Msb0>) -> Self {
if cfg!(feature = "debug") {
println!("[\x1b[38;5;187mSHDP\x1b[0m] \x1b[38;5;21m0x0006\x1b[0m received");
}
InteractionResponse {
decoder,
request_id: 0,
response: None,
}
}
}
impl EventDecoder<Msb0> for InteractionResponse {
fn decode(&mut self, frame: Frame<Msb0>) -> Result<(), Error> {
let upper_id = self.decoder.read_data(32)? >> 0;
let lower_id = self.decoder.read_data(32)? >> 0;
self.request_id = (u64::from(upper_id) << 32) + u64::from(lower_id);
let mut bytes = Vec::<u8>::new();
for _ in 0..(frame.data_size - 64) / 8 {
bytes.push(self.decoder.read_data(8)? as u8);
}
let data = String::from_utf8(bytes).unwrap();
self.response = Some(match serde_json::from_str(&data) {
Ok(value) => value,
Err(_) => Value::Null,
});
Ok(())
}
fn get_responses(
&self,
) -> Result<Vec<Box<dyn EventEncoder<<Msb0 as BitReversible>::Opposite>>>, Error> {
Ok(Vec::new())
}
}