field_kinds/field_meta/
visitors.rs1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
5pub struct FieldMeta {
6 pub name: &'static str,
8 pub serialized_name: &'static str,
10 pub category: &'static str,
12 pub tags: &'static [&'static str],
14}
15
16impl FieldMeta {
17 pub const fn has_tag(&self, tag: &str) -> bool {
19 let mut i = 0;
20 while i < self.tags.len() {
21 if const_str_eq(self.tags[i], tag) {
22 return true;
23 }
24 i += 1;
25 }
26 false
27 }
28
29 pub const fn has_category(&self, category: &str) -> bool {
31 const_str_eq(self.category, category)
32 }
33
34 pub fn matches(
41 &self,
42 name: Option<&str>,
43 category: Option<&str>,
44 tag: Option<&str>,
45 ) -> bool {
46 let name_ok = name.is_none_or(|n| self.name == n);
47 let category_ok = category.is_none_or(|c| self.category == c);
48 let tag_ok = tag.is_none_or(|t| self.tags.contains(&t));
49 name_ok && category_ok && tag_ok
50 }
51}
52
53const fn const_str_eq(a: &str, b: &str) -> bool {
54 let a = a.as_bytes();
55 let b = b.as_bytes();
56 if a.len() != b.len() {
57 return false;
58 }
59 let mut i = 0;
60 while i < a.len() {
61 if a[i] != b[i] {
62 return false;
63 }
64 i += 1;
65 }
66 true
67}
68
69pub trait VisitFields {
73 const FIELDS: &'static [FieldMeta];
75}