use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::definition::ProvenanceClass;
use crate::grade::Grade;
use crate::ids::SnapshotId;
use crate::limits::SNAPSHOT_V1;
use crate::schema;
use crate::time::Timestamp;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct Snapshot {
pub schema: String,
pub entries: Vec<Entry>,
}
crate::document::versioned_document!(
Snapshot,
[schema::SNAPSHOT, schema::SNAPSHOT_V2],
"rustev.snapshot/1 or rustev.snapshot/2",
SNAPSHOT_V1,
SnapshotId
);
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct Entry {
pub field: String,
pub value: Value,
pub provenance: ProvenanceClass,
pub as_of_ms: Timestamp,
pub source: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub grade: Option<Grade>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::screening::present"
)]
pub producer: Option<Producer>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct Producer {
pub artifact_id: crate::ids::ArtifactId,
pub template_digest: TemplateDigest,
pub produced_at_ms: Timestamp,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum TemplateDigest {
None,
#[serde(untagged)]
Digest(crate::ids::PromptTemplateId),
}