proto_types/protovalidate/
const_rules.rs

1use 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);