veloren_client_i18n/
error.rs

1use fluent_syntax::parser::ParserError;
2use std::{error::Error, fmt, ops::Range};
3
4#[derive(Debug)]
5struct Pos {
6    line: usize,
7    character: usize,
8}
9
10impl fmt::Display for Pos {
11    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
12        write!(f, "{};{}", self.line, self.character)
13    }
14}
15
16fn unspan(src: &str, span: Range<usize>) -> Range<Pos> {
17    let count = |idx| {
18        let mut line = 1;
19        let mut character = 1;
20        for ch in src.bytes().take(idx) {
21            // Count characters
22            character += 1;
23
24            // Count newlines
25            if ch == b'\n' {
26                line += 1;
27                // If found new line, reset character count
28                character = 1;
29            }
30        }
31        Pos { line, character }
32    };
33    let Range { start, end } = span;
34    count(start)..count(end)
35}
36
37// TODO:
38// Ideally we wouldn't write this code, check this issue in fluent-rs.
39// https://github.com/projectfluent/fluent-rs/issues/176
40#[derive(Debug)]
41pub enum ResourceErr {
42    ParsingError {
43        #[expect(dead_code)] // false-positive
44        file: String,
45        #[expect(dead_code)] // false-positive
46        err: String,
47    },
48    #[expect(dead_code)] // false-positive
49    BundleError(String),
50}
51
52impl ResourceErr {
53    pub fn parsing_error(errs: Vec<ParserError>, file: String, src: &str) -> Self {
54        let errs = errs
55            .into_iter()
56            .map(|e| {
57                let Range {
58                    start: from,
59                    end: to,
60                } = unspan(src, e.pos);
61                format!("{from}..{to}, kind {:?}", e.kind)
62            })
63            .collect::<Vec<_>>();
64
65        Self::ParsingError {
66            file,
67            err: format!("{errs:?}"),
68        }
69    }
70}
71
72impl fmt::Display for ResourceErr {
73    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{self:#?}") }
74}
75
76impl Error for ResourceErr {}