1#[derive(Debug, Default, Clone, PartialEq, serde::Deserialize, serde::Serialize)]
2pub struct Record {
3 pub name: String,
4 pub fields: Vec<fastn_resolved::Field>,
5 pub line_number: usize,
6}
7
8impl Record {
9 pub fn new(name: &str, fields: Vec<Field>, line_number: usize) -> Record {
10 Record {
11 name: name.to_string(),
12 fields,
13 line_number,
14 }
15 }
16}
17#[derive(Debug, Clone, PartialEq, serde::Deserialize, serde::Serialize)]
18pub struct Field {
19 pub name: String,
20 pub kind: fastn_resolved::KindData,
21 pub mutable: bool,
22 pub value: Option<fastn_resolved::PropertyValue>,
23 pub line_number: usize,
24 pub access_modifier: AccessModifier,
25}
26
27impl Field {
28 pub fn new(
29 name: &str,
30 kind: fastn_resolved::KindData,
31 mutable: bool,
32 value: Option<fastn_resolved::PropertyValue>,
33 line_number: usize,
34 ) -> Field {
35 Field {
36 name: name.to_string(),
37 kind,
38 mutable,
39 value,
40 line_number,
41 access_modifier: Default::default(),
42 }
43 }
44
45 pub fn to_sources(&self) -> Vec<fastn_resolved::PropertySource> {
46 let mut sources = vec![fastn_resolved::PropertySource::Header {
47 name: self.name.to_string(),
48 mutable: self.mutable,
49 }];
50 if self.is_caption() {
51 sources.push(fastn_resolved::PropertySource::Caption);
52 }
53
54 if self.is_body() {
55 sources.push(fastn_resolved::PropertySource::Body);
56 }
57
58 if self.is_subsection_ui() {
59 sources.push(fastn_resolved::PropertySource::Subsection);
60 }
61
62 sources
63 }
64
65 pub fn default(name: &str, kind: fastn_resolved::KindData) -> fastn_resolved::Field {
66 fastn_resolved::Field {
67 name: name.to_string(),
68 kind,
69 mutable: false,
70 value: None,
71 line_number: 0,
72 access_modifier: Default::default(),
73 }
74 }
75
76 pub fn default_with_value(
77 name: &str,
78 kind: fastn_resolved::KindData,
79 value: fastn_resolved::PropertyValue,
80 ) -> Field {
81 Field {
82 name: name.to_string(),
83 kind,
84 mutable: false,
85 value: Some(value),
86 line_number: 0,
87 access_modifier: Default::default(),
88 }
89 }
90
91 pub fn is_caption(&self) -> bool {
92 self.kind.caption
93 }
94
95 pub fn is_subsection_ui(&self) -> bool {
96 self.kind.kind.clone().inner_list().is_subsection_ui()
97 }
98
99 pub fn is_body(&self) -> bool {
100 self.kind.body
101 }
102
103 pub fn is_value_required(&self) -> bool {
104 if self.kind.is_optional() || self.kind.is_list() {
105 return false;
106 }
107 self.value.is_none()
108 }
109}
110
111#[derive(Debug, Default, PartialEq, Clone, serde::Serialize, serde::Deserialize)]
112pub enum AccessModifier {
113 #[default]
114 Public,
115 Private,
116}
117
118impl AccessModifier {
119 pub fn is_public(&self) -> bool {
120 matches!(self, AccessModifier::Public)
121 }
122}