Skip to main content

api_testing_core/
cli_report.rs

1use 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}