diff --git a/rust/signed_doc/src/validator/rules/chain/mod.rs b/rust/signed_doc/src/validator/rules/chain/mod.rs index 6ab69e85a2..dfec2c2ac6 100644 --- a/rust/signed_doc/src/validator/rules/chain/mod.rs +++ b/rust/signed_doc/src/validator/rules/chain/mod.rs @@ -1,6 +1,10 @@ //! `chain` rule type impl. -use catalyst_signed_doc_spec::{is_required::IsRequired, metadata::chain::Chain}; +use anyhow::ensure; +use catalyst_signed_doc_spec::{ + is_required::IsRequired, + metadata::{chain::Chain, collaborators::Collaborators}, +}; use crate::{CatalystSignedDocument, providers::CatalystSignedDocumentProvider}; @@ -21,16 +25,24 @@ pub(crate) enum ChainRule { impl ChainRule { /// Generating `ChainRule` from specs - pub(crate) fn new(spec: &Chain) -> Self { + pub(crate) fn new( + spec: &Chain, + collaborators_spec: &Collaborators, + ) -> anyhow::Result { let optional = match spec.required { IsRequired::Yes => false, IsRequired::Optional => true, IsRequired::Excluded => { - return Self::NotSpecified; + return Ok(Self::NotSpecified); }, }; - Self::Specified { optional } + ensure!( + matches!(collaborators_spec.required, IsRequired::Excluded), + "Chained Documents do not support collaborators" + ); + + Ok(Self::Specified { optional }) } /// Field validation rule diff --git a/rust/signed_doc/src/validator/rules/chain/tests.rs b/rust/signed_doc/src/validator/rules/chain/tests.rs index 6646f985e8..23ef494c0a 100644 --- a/rust/signed_doc/src/validator/rules/chain/tests.rs +++ b/rust/signed_doc/src/validator/rules/chain/tests.rs @@ -1,3 +1,4 @@ +use catalyst_signed_doc_spec::{is_required::IsRequired, metadata::chain::Chain as ChainSpec}; use catalyst_types::uuid::{UuidV4, UuidV7}; use test_case::test_case; @@ -48,6 +49,17 @@ async fn test_without_chaining_documents() { assert!(!rule.check(&doc, &provider).await.unwrap()); } +#[tokio::test] +async fn chain_rule_collaborators_rule_conflict() { + let chain = ChainSpec { + required: IsRequired::Optional, + }; + let collaborators = Collaborators { + required: IsRequired::Optional, + }; + ChainRule::new(&chain, &collaborators).unwrap_err(); +} + #[test_case( { let doc_type = UuidV4::new(); diff --git a/rust/signed_doc/src/validator/rules/mod.rs b/rust/signed_doc/src/validator/rules/mod.rs index 9eb84ff218..717650a36d 100644 --- a/rust/signed_doc/src/validator/rules/mod.rs +++ b/rust/signed_doc/src/validator/rules/mod.rs @@ -129,7 +129,7 @@ impl Rules { content_encoding: ContentEncodingRule::new(&doc_spec.headers.content_encoding)?, template: TemplateRule::new(all_docs_specs, &doc_spec.metadata.template)?, parameters: ParametersRule::new(all_docs_specs, &doc_spec.metadata.parameters)?, - chain: ChainRule::new(&doc_spec.metadata.chain), + chain: ChainRule::new(&doc_spec.metadata.chain, &doc_spec.metadata.collaborators)?, doc_ref: RefRule::new(all_docs_specs, &doc_spec.metadata.doc_ref)?, reply: ReplyRule::new(all_docs_specs, &doc_spec.metadata.reply)?, section: SectionRule::NotSpecified,