Skip to main content

openapi_nexus_parser/
serde_error.rs

1//! Serde error extraction utilities
2
3/// Serde error extractor for parsing error messages
4pub struct SerdeErrorExtractor<'a> {
5    error_msg: &'a str,
6}
7
8impl<'a> SerdeErrorExtractor<'a> {
9    /// Create a new serde error extractor from an error message
10    pub fn new(error_msg: &'a str) -> Self {
11        Self { error_msg }
12    }
13
14    /// Extract line and column numbers from serde error message
15    /// Returns (line, column) where line and column are 1-indexed
16    pub fn extract_location(&self) -> (usize, usize) {
17        // Try to parse patterns like "at line 760 column 5" or "line 760, column 5"
18        let mut line = 0;
19        let mut column = 0;
20
21        // Find "line" followed by a number
22        if let Some(line_pos) = self.error_msg.find("line") {
23            let after_line = &self.error_msg[line_pos + 4..];
24            // Skip whitespace
25            let after_whitespace = after_line.trim_start();
26            // Find the number
27            let num_end = after_whitespace
28                .char_indices()
29                .find(|(_, c)| !c.is_ascii_digit())
30                .map(|(i, _)| i)
31                .unwrap_or(after_whitespace.len());
32            if let Ok(parsed_line) = after_whitespace[..num_end].parse::<usize>() {
33                line = parsed_line;
34            }
35        }
36
37        // Find "column" followed by a number
38        if let Some(col_pos) = self.error_msg.find("column") {
39            let after_column = &self.error_msg[col_pos + 6..];
40            // Skip whitespace
41            let after_whitespace = after_column.trim_start();
42            // Find the number
43            let num_end = after_whitespace
44                .char_indices()
45                .find(|(_, c)| !c.is_ascii_digit())
46                .map(|(i, _)| i)
47                .unwrap_or(after_whitespace.len());
48            if let Ok(parsed_column) = after_whitespace[..num_end].parse::<usize>() {
49                column = parsed_column;
50            }
51        }
52
53        (line, column)
54    }
55}