use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use serde_constant::ConstBool;
use serde_with::{base64::Base64, serde_as};
use std::num::NonZeroU16;
#[derive(Debug, Deserialize, Serialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct Manifest {
#[serde(default)]
pub name: Option<String>,
pub sources: Vec<DataSource>,
}
#[derive(Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase", rename_all_fields = "camelCase", untagged)]
pub enum DataSource {
StaticFile {
url: String,
#[allow(unused)]
supports_range_requests: ConstBool<true>,
},
Streamed(StreamedSource),
}
#[derive(Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct StreamedSource {
pub url: String,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub id: Option<String>,
pub topics: Vec<Topic>,
pub schemas: Vec<Schema>,
pub start_time: DateTime<Utc>,
pub end_time: DateTime<Utc>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, Hash)]
#[serde(rename_all = "camelCase")]
pub struct Topic {
pub name: String,
pub message_encoding: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub schema_id: Option<NonZeroU16>,
}
#[serde_as]
#[derive(Debug, Deserialize, Serialize, PartialEq, Eq, Hash)]
#[serde(rename_all = "camelCase")]
pub struct Schema {
pub id: NonZeroU16,
pub name: String,
pub encoding: String,
#[serde_as(as = "Base64")]
pub data: Box<[u8]>,
}