Skip to content

Commit d1a6287

Browse files
committed
wip
1 parent 9345cae commit d1a6287

File tree

4 files changed

+77
-31
lines changed

4 files changed

+77
-31
lines changed

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

Lines changed: 20 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@
22
//! spec.
33
44
mod error;
5+
mod rules;
56
mod signed_doc_spec;
7+
mod types_consts;
68

7-
use proc_macro2::TokenStream;
8-
use quote::quote;
9+
use crate::error::process_error;
910

10-
use crate::{error::process_error, signed_doc_spec::CatalystSignedDocSpec};
11-
12-
/// Defines consts for all Catalyst Signed Documents types values
13-
/// e.g.
11+
/// Defines consts for all Catalyst Signed Documents types values, which are
12+
/// defined inside the `signed_doc.json` spec.
13+
///
14+
/// E.G.
1415
/// ```ignore
1516
/// pub const PROPOSAL: DocType = DocType::try_from_uuid(catalyst_types::uuid::uuid!(
1617
/// "7808d2ba-d511-40af-84e8-c0d1625fdfdc"
@@ -20,33 +21,21 @@ use crate::{error::process_error, signed_doc_spec::CatalystSignedDocSpec};
2021
pub fn catalyst_signed_documents_types_consts(
2122
_: proc_macro::TokenStream
2223
) -> proc_macro::TokenStream {
23-
catalyst_signed_documents_types_consts_impl()
24+
types_consts::catalyst_signed_documents_types_consts_impl()
2425
.unwrap_or_else(process_error)
2526
.into()
2627
}
2728

28-
/// `catalyst_signed_documents_types_consts` macro implementation
29-
fn catalyst_signed_documents_types_consts_impl() -> anyhow::Result<TokenStream> {
30-
let spec = CatalystSignedDocSpec::load_signed_doc_spec()?;
31-
32-
let mut consts_definitions = Vec::new();
33-
for (doc_name, doc_spec) in spec.docs {
34-
let const_type_name_ident = doc_name.ident();
35-
let doc_name = doc_name.name();
36-
let type_uuid = doc_spec.doc_type;
37-
38-
let const_definition = quote! {
39-
#[doc = #doc_name ]
40-
#[doc = "type constant definition"]
41-
pub const #const_type_name_ident: crate::DocType = match crate::DocType::try_from_uuid(catalyst_types::uuid::uuid!(#type_uuid)) {
42-
Ok(v) => v,
43-
Err(_) => panic!("invalid uuid v4 value"),
44-
};
45-
};
46-
consts_definitions.push(const_definition);
47-
}
48-
49-
Ok(quote! {
50-
#(#consts_definitions)*
51-
})
29+
/// Defines `documents_rules` function which will return a defined
30+
/// `catalyst_signed_doc::Rules` instances for each corresponding document type, which are
31+
/// defined inside the `signed_doc.json` spec.
32+
///
33+
/// ```ignore
34+
/// fn documents_rules() -> impl Iterator<Item = (DocType, Rules)>
35+
/// ```
36+
#[proc_macro]
37+
pub fn catalyst_signed_documents_rules(_: proc_macro::TokenStream) -> proc_macro::TokenStream {
38+
rules::catalyst_signed_documents_rules_impl()
39+
.unwrap_or_else(process_error)
40+
.into()
5241
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
//! catalyst_signed_documents_rules! macro implementation
2+
3+
use proc_macro2::TokenStream;
4+
use quote::quote;
5+
6+
use crate::signed_doc_spec::CatalystSignedDocSpec;
7+
8+
/// `catalyst_signed_documents_rules` macro implementation
9+
pub(crate) fn catalyst_signed_documents_rules_impl() -> anyhow::Result<TokenStream> {
10+
let _spec = CatalystSignedDocSpec::load_signed_doc_spec()?;
11+
12+
Ok(quote! {
13+
/// Returns an iterator with all defined Catalyst Signed Documents validation rules per corresponding document type
14+
fn documents_rules() -> impl Iterator<Item = (DocType, Rules)> {
15+
[].into_iter()
16+
}
17+
})
18+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
//! catalyst_signed_documents_types_consts! macro implementation
2+
3+
use proc_macro2::TokenStream;
4+
use quote::quote;
5+
6+
use crate::signed_doc_spec::CatalystSignedDocSpec;
7+
8+
/// `catalyst_signed_documents_types_consts` macro implementation
9+
pub(crate) fn catalyst_signed_documents_types_consts_impl() -> anyhow::Result<TokenStream> {
10+
let spec = CatalystSignedDocSpec::load_signed_doc_spec()?;
11+
12+
let mut consts_definitions = Vec::new();
13+
for (doc_name, doc_spec) in spec.docs {
14+
let const_type_name_ident = doc_name.ident();
15+
let doc_name = doc_name.name();
16+
let type_uuid = doc_spec.doc_type;
17+
18+
let const_definition = quote! {
19+
#[doc = #doc_name ]
20+
#[doc = "type constant definition"]
21+
pub const #const_type_name_ident: crate::DocType = match crate::DocType::try_from_uuid(catalyst_types::uuid::uuid!(#type_uuid)) {
22+
Ok(v) => v,
23+
Err(_) => panic!("invalid uuid v4 value"),
24+
};
25+
};
26+
consts_definitions.push(const_definition);
27+
}
28+
29+
Ok(quote! {
30+
#(#consts_definitions)*
31+
})
32+
}

rust/signed_doc/src/validator/mod.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use std::{
99
};
1010

1111
use anyhow::Context;
12+
use catalyst_signed_doc_macro;
1213
use catalyst_types::{catalyst_id::role_index::RoleId, problem_report::ProblemReport};
1314
use rules::{
1415
ContentEncodingRule, ContentRule, ContentSchema, ContentTypeRule, IdRule, ParametersRule,
@@ -26,6 +27,8 @@ use crate::{
2627
CatalystSignedDocument, ContentEncoding, ContentType,
2728
};
2829

30+
catalyst_signed_doc_macro::catalyst_signed_documents_rules!();
31+
2932
/// A table representing a full set or validation rules per document id.
3033
static DOCUMENT_RULES: LazyLock<HashMap<DocType, Arc<Rules>>> = LazyLock::new(document_rules_init);
3134

@@ -159,6 +162,10 @@ fn proposal_submission_action_rule() -> Rules {
159162
fn document_rules_init() -> HashMap<DocType, Arc<Rules>> {
160163
let mut document_rules_map = HashMap::new();
161164

165+
for (doc_type, rule) in documents_rules() {
166+
document_rules_map.insert(doc_type, Arc::new(rule));
167+
}
168+
162169
let proposal_rules = Arc::new(proposal_rule());
163170
let comment_rules = Arc::new(proposal_comment_rule());
164171
let action_rules = Arc::new(proposal_submission_action_rule());

0 commit comments

Comments
 (0)