Skip to content

Commit db82cd3

Browse files
committed
initial
1 parent 57f314c commit db82cd3

File tree

3 files changed

+70
-1
lines changed

3 files changed

+70
-1
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
//! `RefRule` generation
2+
use proc_macro2::TokenStream;
3+
use quote::quote;
4+
5+
use crate::signed_doc_spec::{self, node::IsRequired};
6+
7+
/// Generating `RefRule` instantiation
8+
pub(crate) fn ref_rule(ref_spec: &signed_doc_spec::node::ContentType) -> anyhow::Result<TokenStream> {
9+
let optional = match ref_spec.required {
10+
IsRequired::Yes => true,
11+
IsRequired::Optional => false,
12+
IsRequired::Excluded => {
13+
return Ok(quote! {
14+
crate::validator::rules::RefRule::NotSpecified
15+
});
16+
},
17+
};
18+
19+
anyhow::ensure!(!ref_spec.doc_type.is_empty(), "'type' field should exists and has at least one entry for the required 'ref' metadata definition");
20+
21+
let const_type_name_idents = ref_spec.doc_type.iter().map(|doc_name| {
22+
let const_type_name_ident = doc_name.ident();
23+
quote! {
24+
crate::doc_types::#const_type_name_ident
25+
}
26+
});
27+
let multiple = ref_spec.multiple.ok_or(anyhow::anyhow!(
28+
"'multiple' field should exists for the required 'ref' metadata definition"
29+
))?;
30+
Ok(quote! {
31+
crate::validator::rules::ContentTypeRule {
32+
exp: ContentType::Json,
33+
}
34+
})
35+
}

rust/catalyst-signed-doc-macro/src/rules/mod.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
//! `catalyst_signed_documents_rules!` macro implementation
22
3+
pub(crate) mod content_type;
4+
35
use proc_macro2::TokenStream;
46
use quote::quote;
57

@@ -10,9 +12,11 @@ pub(crate) fn catalyst_signed_documents_rules_impl() -> anyhow::Result<TokenStre
1012
let spec = CatalystSignedDocSpec::load_signed_doc_spec()?;
1113

1214
let mut rules_definitions = Vec::new();
13-
for (doc_name, _doc_spec) in spec.docs {
15+
for (doc_name, doc_spec) in spec.docs {
1416
let const_type_name_ident = doc_name.ident();
1517

18+
let content_type_rule = content_type::ref_rule(&doc_spec.metadata.content_type)?;
19+
1620
// TODO: implement a proper initialization for all specific validation rules
1721
let rules = quote! {
1822
crate::validator::rules::Rules {

rust/catalyst-signed-doc-macro/src/signed_doc_spec.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ pub(crate) struct DocSpec {
4343
/// Document type UUID v4 value
4444
#[serde(rename = "type")]
4545
pub(crate) doc_type: String,
46+
/// Document type metadata definitions
47+
pub(crate) metadata: node::MetadataNode,
4648
}
4749

4850
impl CatalystSignedDocSpec {
@@ -56,6 +58,34 @@ impl CatalystSignedDocSpec {
5658
}
5759
}
5860

61+
pub(crate) mod node {
62+
/// "required" field definition
63+
#[derive(serde::Deserialize)]
64+
#[serde(rename_all = "lowercase")]
65+
#[allow(clippy::missing_docs_in_private_items)]
66+
pub(crate) enum IsRequired {
67+
Yes,
68+
Excluded,
69+
Optional,
70+
}
71+
72+
/// Document's metadata fields definition
73+
#[derive(serde::Deserialize)]
74+
#[allow(clippy::missing_docs_in_private_items)]
75+
pub(crate) struct MetadataNode {
76+
#[serde(rename = "ref")]
77+
pub(crate) content_type: ContentType,
78+
}
79+
80+
/// `signed_doc.json` "ref" field JSON object
81+
#[derive(serde::Deserialize)]
82+
#[allow(clippy::missing_docs_in_private_items)]
83+
pub(crate) struct ContentType {
84+
pub(crate) required: IsRequired,
85+
pub(crate) value: Vec<String>,
86+
}
87+
}
88+
5989
#[cfg(test)]
6090
mod tests {
6191
use super::*;

0 commit comments

Comments
 (0)