|
1 | 1 | use super::progress::format_number; |
2 | 2 | use crate::core::{analysis::ProjectAnalysis, error::Result}; |
3 | 3 | use colored::Colorize; |
4 | | -use serde_xml_rs; |
5 | 4 |
|
6 | 5 | pub fn print_table_format(project_analysis: &ProjectAnalysis, detailed: bool, quiet: bool) { |
7 | 6 | let summary = project_analysis.get_summary(); |
@@ -159,71 +158,82 @@ pub fn print_csv_format(project_analysis: &ProjectAnalysis) -> Result<()> { |
159 | 158 | } |
160 | 159 |
|
161 | 160 | pub fn print_xml_format(project_analysis: &ProjectAnalysis) -> Result<()> { |
162 | | - #[derive(serde::Serialize)] |
163 | | - struct XmlProjectAnalysis { |
164 | | - project_name: String, |
165 | | - summary: XmlSummary, |
166 | | - language_statistics: Vec<XmlLanguageStats>, |
167 | | - } |
| 161 | + let summary = project_analysis.get_summary(); |
| 162 | + let language_stats = project_analysis.get_language_statistics(); |
168 | 163 |
|
169 | | - #[derive(serde::Serialize)] |
170 | | - struct XmlSummary { |
171 | | - total_files: usize, |
172 | | - total_lines: usize, |
173 | | - total_code_lines: usize, |
174 | | - total_comment_lines: usize, |
175 | | - total_blank_lines: usize, |
176 | | - language_count: usize, |
177 | | - primary_language: Option<String>, |
178 | | - overall_complexity_ratio: f64, |
179 | | - overall_documentation_ratio: f64, |
180 | | - } |
| 164 | + println!("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); |
| 165 | + println!("<project_analysis>"); |
| 166 | + |
| 167 | + println!( |
| 168 | + " <project_name>{}</project_name>", |
| 169 | + xml_escape(&summary.project_name) |
| 170 | + ); |
| 171 | + |
| 172 | + println!(" <summary>"); |
| 173 | + println!(" <total_files>{}</total_files>", summary.total_files); |
| 174 | + println!(" <total_lines>{}</total_lines>", summary.total_lines); |
| 175 | + println!( |
| 176 | + " <total_code_lines>{}</total_code_lines>", |
| 177 | + summary.total_code_lines |
| 178 | + ); |
| 179 | + println!( |
| 180 | + " <total_comment_lines>{}</total_comment_lines>", |
| 181 | + summary.total_comment_lines |
| 182 | + ); |
| 183 | + println!( |
| 184 | + " <total_blank_lines>{}</total_blank_lines>", |
| 185 | + summary.total_blank_lines |
| 186 | + ); |
| 187 | + println!( |
| 188 | + " <language_count>{}</language_count>", |
| 189 | + summary.language_count |
| 190 | + ); |
181 | 191 |
|
182 | | - #[derive(serde::Serialize)] |
183 | | - struct XmlLanguageStats { |
184 | | - language_name: String, |
185 | | - file_count: usize, |
186 | | - total_lines: usize, |
187 | | - code_lines: usize, |
188 | | - comment_lines: usize, |
189 | | - blank_lines: usize, |
190 | | - complexity_ratio: f64, |
| 192 | + if let Some(ref primary_lang) = summary.primary_language { |
| 193 | + println!( |
| 194 | + " <primary_language>{}</primary_language>", |
| 195 | + xml_escape(primary_lang) |
| 196 | + ); |
191 | 197 | } |
192 | 198 |
|
193 | | - let summary = project_analysis.get_summary(); |
194 | | - let language_stats = project_analysis.get_language_statistics(); |
| 199 | + println!( |
| 200 | + " <overall_complexity_ratio>{:.6}</overall_complexity_ratio>", |
| 201 | + summary.overall_complexity_ratio |
| 202 | + ); |
| 203 | + println!( |
| 204 | + " <overall_documentation_ratio>{:.6}</overall_documentation_ratio>", |
| 205 | + summary.overall_documentation_ratio |
| 206 | + ); |
| 207 | + println!(" </summary>"); |
195 | 208 |
|
196 | | - let xml_data = XmlProjectAnalysis { |
197 | | - project_name: summary.project_name.clone(), |
198 | | - summary: XmlSummary { |
199 | | - total_files: summary.total_files, |
200 | | - total_lines: summary.total_lines, |
201 | | - total_code_lines: summary.total_code_lines, |
202 | | - total_comment_lines: summary.total_comment_lines, |
203 | | - total_blank_lines: summary.total_blank_lines, |
204 | | - language_count: summary.language_count, |
205 | | - primary_language: summary.primary_language.clone(), |
206 | | - overall_complexity_ratio: summary.overall_complexity_ratio, |
207 | | - overall_documentation_ratio: summary.overall_documentation_ratio, |
208 | | - }, |
209 | | - language_statistics: language_stats |
210 | | - .iter() |
211 | | - .map(|stats| XmlLanguageStats { |
212 | | - language_name: stats.language_name.clone(), |
213 | | - file_count: stats.file_count, |
214 | | - total_lines: stats.total_lines, |
215 | | - code_lines: stats.code_lines, |
216 | | - comment_lines: stats.comment_lines, |
217 | | - blank_lines: stats.blank_lines, |
218 | | - complexity_ratio: stats.complexity_ratio, |
219 | | - }) |
220 | | - .collect(), |
221 | | - }; |
222 | | - |
223 | | - let xml = serde_xml_rs::to_string(&xml_data) |
224 | | - .map_err(|e| crate::core::error::AnalysisError::xml_serialization(e.to_string()))?; |
| 209 | + println!(" <language_statistics>"); |
| 210 | + for stats in language_stats { |
| 211 | + println!(" <language>"); |
| 212 | + println!(" <name>{}</name>", xml_escape(&stats.language_name)); |
| 213 | + println!(" <file_count>{}</file_count>", stats.file_count); |
| 214 | + println!(" <total_lines>{}</total_lines>", stats.total_lines); |
| 215 | + println!(" <code_lines>{}</code_lines>", stats.code_lines); |
| 216 | + println!( |
| 217 | + " <comment_lines>{}</comment_lines>", |
| 218 | + stats.comment_lines |
| 219 | + ); |
| 220 | + println!(" <blank_lines>{}</blank_lines>", stats.blank_lines); |
| 221 | + println!( |
| 222 | + " <complexity_ratio>{:.6}</complexity_ratio>", |
| 223 | + stats.complexity_ratio |
| 224 | + ); |
| 225 | + println!(" </language>"); |
| 226 | + } |
| 227 | + println!(" </language_statistics>"); |
225 | 228 |
|
226 | | - println!("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); |
227 | | - println!("{}", xml); |
| 229 | + println!("</project_analysis>"); |
228 | 230 | Ok(()) |
229 | 231 | } |
| 232 | + |
| 233 | +fn xml_escape(text: &str) -> String { |
| 234 | + text.replace("&", "&") |
| 235 | + .replace("<", "<") |
| 236 | + .replace(">", ">") |
| 237 | + .replace("\"", """) |
| 238 | + .replace("'", "'") |
| 239 | +} |
0 commit comments