Mountain/ApplicationState/DTO/
MarkerDataDTO.rs1use serde::{Deserialize, Serialize};
20use serde_json::Value;
21
22use super::MarkerSeverity::MarkerSeverity;
23
24const MAX_MARKER_MESSAGE_LENGTH:usize = 10_000;
26
27const MAX_SOURCE_LENGTH:usize = 256;
29
30#[derive(Serialize, Deserialize, Debug, Clone, Default)]
34#[serde(rename_all = "PascalCase")]
35pub struct MarkerDataDTO {
36 pub Severity:u32,
38
39 #[serde(skip_serializing_if = "String::is_empty")]
41 pub Message:String,
42
43 pub StartLineNumber:u32,
45
46 pub StartColumn:u32,
48
49 pub EndLineNumber:u32,
51
52 pub EndColumn:u32,
54
55 #[serde(skip_serializing_if = "Option::is_none")]
57 pub Source:Option<String>,
58
59 #[serde(skip_serializing_if = "Option::is_none")]
61 pub Code:Option<Value>,
62
63 #[serde(skip_serializing_if = "Option::is_none")]
65 pub ModelVersionIdentifier:Option<u64>,
66
67 #[serde(skip_serializing_if = "Option::is_none")]
69 pub RelatedInformation:Option<Value>,
70
71 #[serde(skip_serializing_if = "Option::is_none")]
73 pub Tags:Option<Vec<u32>>,
74}
75
76impl MarkerDataDTO {
77 pub fn New(
90 Severity:u32,
91 Message:String,
92 StartLineNumber:u32,
93 StartColumn:u32,
94 EndLineNumber:u32,
95 EndColumn:u32,
96 ) -> Result<Self, String> {
97 if Severity > 8 || Severity == 0 {
99 return Err("Invalid severity value: must be 1, 2, 4, or 8".to_string());
100 }
101
102 if Message.len() > MAX_MARKER_MESSAGE_LENGTH {
104 return Err(format!("Message exceeds maximum length of {} bytes", MAX_MARKER_MESSAGE_LENGTH));
105 }
106
107 if StartLineNumber > EndLineNumber {
109 return Err("Start line number cannot be greater than end line number".to_string());
110 }
111
112 if StartLineNumber == EndLineNumber && StartColumn > EndColumn {
114 return Err("Start column cannot be greater than end column on the same line".to_string());
115 }
116
117 Ok(Self {
118 Severity,
119 Message,
120 StartLineNumber,
121 StartColumn,
122 EndLineNumber,
123 EndColumn,
124 Source:None,
125 Code:None,
126 ModelVersionIdentifier:None,
127 RelatedInformation:None,
128 Tags:None,
129 })
130 }
131
132 pub fn ValidatePosition(&self) -> Result<(), String> {
137 if self.StartLineNumber > self.EndLineNumber {
138 return Err("Start line number cannot be greater than end line number".to_string());
139 }
140
141 if self.StartLineNumber == self.EndLineNumber && self.StartColumn > self.EndColumn {
142 return Err("Start column cannot be greater than end column on the same line".to_string());
143 }
144
145 Ok(())
146 }
147
148 pub fn SetSource(&mut self, Source:String) -> Result<(), String> {
156 if Source.len() > MAX_SOURCE_LENGTH {
157 return Err(format!("Source exceeds maximum length of {} bytes", MAX_SOURCE_LENGTH));
158 }
159
160 self.Source = Some(Source);
161 Ok(())
162 }
163
164 pub fn GetSeverity(&self) -> Option<MarkerSeverity> {
169 match self.Severity {
170 8 => Some(MarkerSeverity::Error),
171 4 => Some(MarkerSeverity::Warning),
172 2 => Some(MarkerSeverity::Information),
173 1 => Some(MarkerSeverity::Hint),
174 _ => None,
175 }
176 }
177
178 pub fn Error(Message:String, LineNumber:u32, Column:u32) -> Self {
188 Self {
189 Severity:MarkerSeverity::Error as u32,
190 Message,
191 StartLineNumber:LineNumber,
192 StartColumn:Column,
193 EndLineNumber:LineNumber,
194 EndColumn:Column,
195 ..Default::default()
196 }
197 }
198
199 pub fn Warning(Message:String, LineNumber:u32, Column:u32) -> Self {
209 Self {
210 Severity:MarkerSeverity::Warning as u32,
211 Message,
212 StartLineNumber:LineNumber,
213 StartColumn:Column,
214 EndLineNumber:LineNumber,
215 EndColumn:Column,
216 ..Default::default()
217 }
218 }
219}