proto_types/protovalidate/
const_rules.rs1use proc_macro2::Span;
2use quote::ToTokens;
3use syn::LitByteStr;
4
5use crate::{
6 protovalidate::{
7 containing_rules::format_bytes, BoolRules, BytesRules, DoubleRules, DurationRules, EnumRules,
8 Fixed32Rules, Fixed64Rules, FloatRules, Int32Rules, Int64Rules, SFixed32Rules, SFixed64Rules,
9 SInt32Rules, SInt64Rules, StringRules, TimestampRules, UInt32Rules, UInt64Rules,
10 },
11 Duration, Timestamp,
12};
13
14pub struct ConstRule<T>
15where
16 T: ToTokens,
17{
18 pub val: T,
19 pub error_message: String,
20}
21
22macro_rules! const_rule {
23 ($rule_type:ty, $target_type:ty) => {
24 impl $rule_type {
25 pub fn const_rule(&self) -> Option<ConstRule<$target_type>> {
26 self.r#const.as_ref().map(|v| ConstRule {
27 val: v.clone(),
28 error_message: format!("must be equal to {:?}", v),
29 })
30 }
31 }
32 };
33}
34
35impl BytesRules {
36 pub fn const_rule(&self) -> Option<ConstRule<LitByteStr>> {
37 self.r#const.as_ref().map(|v| ConstRule {
38 val: LitByteStr::new(v, Span::call_site()),
39 error_message: format!("must be equal to {}", format_bytes(v)),
40 })
41 }
42}
43
44const_rule!(DurationRules, Duration);
45const_rule!(TimestampRules, Timestamp);
46const_rule!(StringRules, String);
47const_rule!(BoolRules, bool);
48const_rule!(EnumRules, i32);
49const_rule!(FloatRules, f32);
50const_rule!(DoubleRules, f64);
51const_rule!(Int64Rules, i64);
52const_rule!(SInt64Rules, i64);
53const_rule!(SFixed64Rules, i64);
54const_rule!(Fixed64Rules, u64);
55const_rule!(UInt64Rules, u64);
56const_rule!(Int32Rules, i32);
57const_rule!(SInt32Rules, i32);
58const_rule!(SFixed32Rules, i32);
59const_rule!(Fixed32Rules, u32);
60const_rule!(UInt32Rules, u32);