veloren_client_i18n/
error.rs1use 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 character += 1;
23
24 if ch == b'\n' {
26 line += 1;
27 character = 1;
29 }
30 }
31 Pos { line, character }
32 };
33 let Range { start, end } = span;
34 count(start)..count(end)
35}
36
37#[derive(Debug)]
41pub enum ResourceErr {
42 ParsingError {
43 #[expect(dead_code)] file: String,
45 #[expect(dead_code)] err: String,
47 },
48 #[expect(dead_code)] 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 {}