api_testing_core/
cli_report.rs1use std::path::{Path, PathBuf};
2
3use crate::cli_util;
4
5pub struct ReportMetadata {
6 pub project_root: PathBuf,
7 pub out_path: PathBuf,
8 pub report_date: String,
9 pub generated_at: String,
10}
11
12pub struct ReportMetadataConfig<'a> {
13 pub case_name: &'a str,
14 pub out_path: Option<&'a str>,
15 pub project_root: Option<&'a str>,
16 pub report_dir_env: &'a str,
17 pub invocation_dir: &'a Path,
18}
19
20pub fn build_report_metadata(cfg: ReportMetadataConfig<'_>) -> ReportMetadata {
21 let project_root = if let Some(p) = cfg.project_root.and_then(cli_util::trim_non_empty) {
22 PathBuf::from(p)
23 } else {
24 cli_util::find_git_root(cfg.invocation_dir)
25 .unwrap_or_else(|| cfg.invocation_dir.to_path_buf())
26 };
27
28 let out_path = match cfg.out_path.and_then(cli_util::trim_non_empty) {
29 Some(p) => PathBuf::from(p),
30 None => {
31 let stamp =
32 cli_util::report_stamp_now().unwrap_or_else(|_| "00000000-0000".to_string());
33 let case_slug = cli_util::slugify(cfg.case_name.trim());
34 let case_slug = if case_slug.is_empty() {
35 "case".to_string()
36 } else {
37 case_slug
38 };
39
40 let report_dir = std::env::var(cfg.report_dir_env)
41 .ok()
42 .and_then(|s| cli_util::trim_non_empty(&s));
43 let report_dir = match report_dir {
44 None => project_root.join("docs"),
45 Some(d) => {
46 let p = PathBuf::from(d);
47 if p.is_absolute() {
48 p
49 } else {
50 project_root.join(p)
51 }
52 }
53 };
54
55 report_dir.join(format!("{stamp}-{case_slug}-api-test-report.md"))
56 }
57 };
58
59 let report_date = cli_util::report_date_now().unwrap_or_else(|_| "0000-00-00".to_string());
60 let generated_at = cli_util::history_timestamp_now().unwrap_or_else(|_| "".to_string());
61
62 ReportMetadata {
63 project_root,
64 out_path,
65 report_date,
66 generated_at,
67 }
68}
69
70pub fn endpoint_note(url: Option<&str>, env: Option<&str>, implicit_note: &str) -> String {
71 if url.and_then(cli_util::trim_non_empty).is_some() {
72 format!("Endpoint: --url {}", url.unwrap_or_default())
73 } else if env.and_then(cli_util::trim_non_empty).is_some() {
74 format!("Endpoint: --env {}", env.unwrap_or_default())
75 } else {
76 implicit_note.to_string()
77 }
78}