gesha_core/conversions/
format_errors.rs

1use crate::{Error, Output};
2use openapi_types as oas;
3
4pub fn format_errors<A>(output: Output<A>) -> Option<String> {
5    let (_, errors) = output.into_tuple();
6    if errors.is_empty() {
7        return None;
8    }
9    let errors = errors
10        .into_iter()
11        .flat_map(format_core_error)
12        .collect::<Vec<_>>();
13
14    let lines = errors.join("\n").to_string();
15    Some(lines)
16}
17
18fn format_core_error(err: Error) -> Vec<String> {
19    let mut lines = vec![];
20    match err {
21        Error::OpenApiTypes { path, cause } => {
22            lines.push(format!("path: {}", path.to_string_lossy()));
23            lines.append(&mut format_open_api_error(cause, vec![]));
24        }
25        e => lines.push(format!("{:#?}", e)),
26    }
27    lines.push("".to_string());
28    lines
29}
30
31fn format_open_api_error(err: oas::Error, mut keys: Vec<String>) -> Vec<String> {
32    let mut lines = vec![];
33    match err {
34        oas::Error::Multiple { causes } => {
35            let mut next_lines = causes
36                .into_iter()
37                .flat_map(|e| format_open_api_error(e, keys.clone()))
38                .collect();
39
40            lines.append(&mut next_lines)
41        }
42        oas::Error::Enclosed { key, causes } => {
43            keys.push(key);
44            let mut next_lines = format_enclosed_error(causes, keys);
45            lines.append(&mut next_lines)
46        }
47        _ => {
48            lines.push(format!("\n    @ {}", keys.join(" > ")));
49
50            let mut next_lines = format!("{:#?}\n", err)
51                .lines()
52                .map(|line| format!("    {}", line))
53                .collect::<Vec<_>>();
54
55            lines.append(&mut next_lines);
56        }
57    }
58    lines
59}
60
61fn format_enclosed_error(causes: Vec<oas::Error>, keys: Vec<String>) -> Vec<String> {
62    causes
63        .into_iter()
64        .flat_map(|cause| format_open_api_error(cause, keys.clone()))
65        .collect()
66}