json_spanned_value/
error_ext.rs

1/// Utility methods extending [serde_json::Error]
2pub trait ErrorExt {
3    /// **Zero**-based byte offset at which the error was detected.
4    /// Returns `None` if this reaches or exceeds `text.len()`.
5    fn offset_within(&self, text: &str) -> Option<usize>;
6}
7
8impl ErrorExt for serde_json::Error {
9    fn offset_within(&self, text: &str) -> Option<usize> {
10        let mut remaining = text;
11        for _ in 1..self.line() {
12            match remaining.find('\n') {
13                None => return None,
14                Some(n) => remaining = &remaining[(n+1)..],
15            };
16        }
17
18        let n = (text.len() - remaining.len()).checked_add(self.column().saturating_sub(1))?;
19        return if n < text.len() { Some(n) } else { None };
20    }
21}