gesha_core/conversions/
format_errors.rs1use 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}