teliox 0.17.13

Library for the Transaction Event Log
Documentation
use crate::error::Error;
use crate::seal::AttachedSourceSeal;
use cesrox::payload::Payload;
use serde::{Deserialize, Serialize};

use super::Event;

#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct VerifiableEvent {
    pub event: Event,
    pub seal: AttachedSourceSeal,
}

impl VerifiableEvent {
    pub fn new(event: Event, seal: AttachedSourceSeal) -> Self {
        Self { event, seal }
    }

    pub fn serialize(&self) -> Result<Vec<u8>, Error> {
        Ok(match &self.event {
            Event::Management(man) => [man.encode()?, self.seal.serialize()?].join("".as_bytes()),
            Event::Vc(vc) => [vc.encode()?, self.seal.serialize()?].join("".as_bytes()),
        })
    }

    pub fn get_event(&self) -> Event {
        self.event.clone()
    }

    pub fn parse(stream: &[u8]) -> Result<Vec<Self>, Error> {
        let events = cesrox::parse_many(stream).unwrap().1;
        events
            .into_iter()
            .map(|ev| -> Result<Self, Error> {
                let event: Event = match ev.payload {
                    Payload::JSON(json) => serde_json::from_slice(&json).unwrap(),
                    _ => todo!(),
                };
                let seal = match &ev.attachments[0] {
                    cesrox::group::Group::SourceSealCouples(seal) => {
                        let (sn, digest) = seal[0].clone();
                        Ok(AttachedSourceSeal::new(sn, (digest.clone()).into()))
                    }
                    _ => Err(Error::Generic("Unexpected attachment".into())),
                }?;
                Ok(Self { event, seal })
            })
            .collect()
    }
}

#[test]
fn test_parse() -> Result<(), Error> {
    let to_parse = r#"{"v":"KERI10JSON000162_","t":"bis","d":"EBHDapxv5R6HDyO-ijNT-lRW8Ft9F9Vv3XIdTIc4z-fk","i":"EEvXZtq623byRrE7h34J7sosXnSlXT5oKMuvntyqTgVa","s":"0","ii":"ECxyKOLIxJM5EO9XFLSzqWI29JusgC9s6-wK16w5jsTs","ra":{"i":"EGeQ8F7zdANw_Nra_WXVBaaGLlRvAJVoJXzQUrKfP8qC","s":"0","d":"EKGKuR7zsPsPd_JiUII8xFcub5_PfUfyZxphTQ08L8L3"},"dt":"2023-06-29T13:15:16.973665+00:00"}-GAB0AAAAAAAAAAAAAAAAAAAAAAgEC6emXzjKLeG08NAMNNIxirnQvJVunkCFkFL-OmprXGh{"v":"KERI10JSON000161_","t":"brv","d":"EEsynyu-azA8vgJ-cbbDmxFZ44UWTncph7Zo6A2RfCW7","i":"EEvXZtq623byRrE7h34J7sosXnSlXT5oKMuvntyqTgVa","s":"1","p":"EBHDapxv5R6HDyO-ijNT-lRW8Ft9F9Vv3XIdTIc4z-fk","ra":{"i":"EGeQ8F7zdANw_Nra_WXVBaaGLlRvAJVoJXzQUrKfP8qC","s":"0","d":"EKGKuR7zsPsPd_JiUII8xFcub5_PfUfyZxphTQ08L8L3"},"dt":"2023-06-29T13:15:16.980295+00:00"}-GAB0AAAAAAAAAAAAAAAAAAAAAAwEL5gH12rlRc4br0sGQfok5XiydNlRqlBGrNMrILv5woc"#;
    let parsed = VerifiableEvent::parse(to_parse.as_bytes())?;
    assert_eq!(parsed.len(), 2);
    Ok(())
}