use crate::types::data_ref::DataRef;
use crate::types::primitives::*;
use crate::types::serde_helpers::de_present;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Body {
pub ctx_id: CtxId,
pub lineage_id: LineageId,
pub origin_registry: String,
pub created_at: DateTime<Utc>,
pub content_hash: ContentHash,
pub signature: Signature,
pub version: u32,
pub supersedes: Option<CtxId>,
pub agent_id: AgentDid,
pub contributors: Vec<AgentDid>,
pub title: String,
#[serde(rename = "type")]
pub context_type: ContextType,
pub data_refs: Vec<DataRef>,
pub derived_from: Vec<CtxId>,
pub visibility: Visibility,
#[serde(skip_serializing_if = "Option::is_none")]
pub audience: Option<Vec<AgentDid>>,
#[serde(
default,
deserialize_with = "de_present",
skip_serializing_if = "Option::is_none"
)]
pub acdp_version: Option<String>,
#[serde(
default,
deserialize_with = "de_present",
skip_serializing_if = "Option::is_none"
)]
pub description: Option<String>,
#[serde(
default,
deserialize_with = "de_present",
skip_serializing_if = "Option::is_none"
)]
pub summary: Option<String>,
#[serde(
default,
deserialize_with = "de_present",
skip_serializing_if = "Option::is_none"
)]
pub tags: Option<Vec<String>>,
#[serde(
default,
deserialize_with = "de_present",
skip_serializing_if = "Option::is_none"
)]
pub domain: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expires_at: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data_period: Option<DataPeriod>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<serde_json::Value>,
#[serde(
default,
deserialize_with = "de_present",
skip_serializing_if = "Option::is_none"
)]
pub schema_uri: Option<String>,
#[serde(flatten)]
pub extensions: serde_json::Map<String, serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct DataPeriod {
pub start: DateTime<Utc>,
pub end: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct Signature {
pub algorithm: String,
pub key_id: String,
pub value: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RegistryState {
pub status: Status,
#[serde(flatten)]
pub extensions: serde_json::Map<String, serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FullContext {
pub body: Body,
pub registry_state: RegistryState,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub registry_receipt: Option<serde_json::Value>,
#[serde(flatten)]
pub extensions: serde_json::Map<String, serde_json::Value>,
}