Skip to content

Commit 4219152

Browse files
committed
fix: cli xml output
1 parent 5551437 commit 4219152

1 file changed

Lines changed: 71 additions & 61 deletions

File tree

src/cli/output.rs

Lines changed: 71 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use super::progress::format_number;
22
use crate::core::{analysis::ProjectAnalysis, error::Result};
33
use colored::Colorize;
4-
use serde_xml_rs;
54

65
pub fn print_table_format(project_analysis: &ProjectAnalysis, detailed: bool, quiet: bool) {
76
let summary = project_analysis.get_summary();
@@ -159,71 +158,82 @@ pub fn print_csv_format(project_analysis: &ProjectAnalysis) -> Result<()> {
159158
}
160159

161160
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();
168163

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+
);
181191

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+
);
191197
}
192198

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>");
195208

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>");
225228

226-
println!("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
227-
println!("{}", xml);
229+
println!("</project_analysis>");
228230
Ok(())
229231
}
232+
233+
fn xml_escape(text: &str) -> String {
234+
text.replace("&", "&amp;")
235+
.replace("<", "&lt;")
236+
.replace(">", "&gt;")
237+
.replace("\"", "&quot;")
238+
.replace("'", "&apos;")
239+
}

0 commit comments

Comments
 (0)