use prikk_error::{PrikkError, Result};
use prikk_object::{ObjectEnvelope, ObjectType, REF_STATE_CLOSED_SCHEMA};
use crate::layout::RepositoryFormat;
pub(crate) fn validate_object_envelope(
format: RepositoryFormat,
envelope: &ObjectEnvelope,
) -> Result<()> {
envelope.validate_strict()?;
match format {
RepositoryFormat::CurrentV6 => validate_format2_schema(envelope),
}
}
pub(crate) fn validate_format2_schema(envelope: &ObjectEnvelope) -> Result<()> {
let accepted: &[u32] = match envelope.object_type {
ObjectType::Block => &[2],
ObjectType::RefState => &[1, REF_STATE_CLOSED_SCHEMA],
ObjectType::Patch
| ObjectType::RefUpdate
| ObjectType::Tag
| ObjectType::Attestation
| ObjectType::Blob
| ObjectType::RecognitionClaim => &[1],
ObjectType::BlockSummaryCache | ObjectType::RecoveryNote | ObjectType::ProjectGenesis => {
return Err(PrikkError::Integrity(format!(
"{} is not authorized in a format-2 identity position",
envelope.object_type
)));
}
};
if !accepted.contains(&envelope.schema_version) {
return Err(PrikkError::Integrity(format!(
"format-2 {} does not accept envelope schema {} (accepted: {accepted:?})",
envelope.object_type, envelope.schema_version
)));
}
Ok(())
}
pub(crate) fn validate_read_schema(
format: RepositoryFormat,
envelope: &ObjectEnvelope,
) -> Result<()> {
match format {
RepositoryFormat::CurrentV6 => {
envelope.validate_strict()?;
validate_format2_schema(envelope)
}
}
}
#[cfg(test)]
mod tests;