use crate::error::IdValidationError;
crate::define_id!(DocumentId, uuid);
crate::define_id!(DocumentFolderId, uuid);
crate::define_id!(DocumentRevisionId, uuid);
crate::define_id!(DocumentEditSessionId, uuid);
crate::define_id!(DocumentCommentId, uuid);
crate::define_id!(DocumentProposalId, uuid);
crate::define_id!(ContentHash, checked, validate_content_hash);
crate::define_id!(DocumentNodeId, checked, |value| {
crate::macros::validate_non_empty("DocumentNodeId", value)
});
crate::define_id!(DocumentOpId, checked, |value| {
crate::macros::validate_non_empty("DocumentOpId", value)
});
crate::define_id!(DocumentTemplateId, checked, |value| {
crate::macros::validate_non_empty("DocumentTemplateId", value)
});
crate::define_id!(DriveDeviceId, checked, |value| {
crate::macros::validate_non_empty("DriveDeviceId", value)
});
const CONTENT_HASH_LEN: usize = 64;
fn validate_content_hash(value: &str) -> Result<(), IdValidationError> {
if value.is_empty() {
return Err(IdValidationError::empty("ContentHash"));
}
if value.len() != CONTENT_HASH_LEN {
return Err(IdValidationError::invalid(
"ContentHash",
"must be exactly 64 hex characters",
));
}
if !value
.bytes()
.all(|b| b.is_ascii_digit() || (b'a'..=b'f').contains(&b))
{
return Err(IdValidationError::invalid(
"ContentHash",
"must be lowercase hex",
));
}
Ok(())
}