1use std::collections::BTreeMap;
2
3use chrono::{DateTime, Utc};
4use libipld_core::ipld::Ipld;
5use serde::{Deserialize, Serialize};
6
7#[derive(Serialize, Deserialize, Debug, Default, PartialEq, Clone)]
8pub struct JWS {
9 #[serde(skip_serializing_if = "Option::is_none")]
10 pub payload: Option<String>,
11 #[serde(skip_serializing_if = "Option::is_none")]
12 pub signatures: Option<Vec<SignatureEntry>>,
13 #[serde(skip_serializing_if = "Option::is_none")]
14 pub header: Option<BTreeMap<String, Ipld>>,
15 #[serde(flatten)]
16 pub extra: BTreeMap<String, Ipld>,
17}
18
19#[derive(Serialize, Deserialize, Debug, Default, PartialEq, Clone)]
20pub struct SignatureEntry {
21 #[serde(skip_serializing_if = "Option::is_none")]
22 pub payload: Option<String>,
23 #[serde(skip_serializing_if = "Option::is_none")]
24 pub protected: Option<String>,
25 #[serde(skip_serializing_if = "Option::is_none")]
26 pub signature: Option<String>,
27 #[serde(flatten)]
28 pub extra: BTreeMap<String, Ipld>,
29}
30
31#[derive(Serialize, Deserialize, Debug, Default, PartialEq, Clone)]
32pub struct Message {
33 pub descriptor: Descriptor,
34 #[serde(rename = "recordId", skip_serializing_if = "Option::is_none")]
35 pub record_id: Option<String>,
36 #[serde(skip_serializing_if = "Option::is_none")]
37 pub authorization: Option<JWS>,
38 #[serde(skip_serializing_if = "Option::is_none")]
39 pub attestation: Option<JWS>,
40 #[serde(flatten)]
41 pub extra: BTreeMap<String, Ipld>,
42}
43
44#[derive(Serialize, Deserialize, Debug, Default, PartialEq, Clone)]
45pub struct Descriptor {
46 pub interface: String,
47 pub method: String,
48 #[serde(rename = "dataSize", skip_serializing_if = "Option::is_none")]
49 pub data_size: Option<u32>,
50 #[serde(
51 rename = "messageTimestamp",
52 serialize_with = "crate::serde::serialize_optional_datetime",
53 skip_serializing_if = "Option::is_none"
54 )]
55 pub timestamp: Option<DateTime<Utc>>,
56 #[serde(
57 rename = "dateCreated",
58 serialize_with = "crate::serde::serialize_optional_datetime",
59 skip_serializing_if = "Option::is_none"
60 )]
61 pub date_created: Option<DateTime<Utc>>,
62 #[serde(
63 rename = "datePublished",
64 serialize_with = "crate::serde::serialize_optional_datetime",
65 skip_serializing_if = "Option::is_none"
66 )]
67 pub date_published: Option<DateTime<Utc>>,
68 #[serde(skip_serializing_if = "Option::is_none")]
69 pub filter: Option<MessageFilter>,
70 #[serde(skip_serializing_if = "Option::is_none")]
71 pub published: Option<bool>,
72 #[serde(flatten)]
73 pub extra: BTreeMap<String, Ipld>,
74}
75
76#[derive(Serialize, Deserialize, Debug, Default, PartialEq, Clone)]
77pub struct MessageFilter {
78 #[serde(rename = "dateCreated", skip_serializing_if = "Option::is_none")]
79 pub date_created: Option<DateTime<Utc>>,
80 #[serde(flatten)]
81 pub extra: BTreeMap<String, Ipld>,
82}