|
1 | 1 | use crate::cross::*; |
2 | 2 | use crate::template::mj_value::*; |
| 3 | +use crate::template::neon::NeonMiniJinjaContext; |
3 | 4 | use crate::utils::bind_method; |
| 5 | + |
4 | 6 | use log::trace; |
5 | 7 | use minijinja as mj; |
6 | | -use neon::context::Context; |
7 | 8 | use neon::prelude::*; |
8 | 9 | use std::cell::RefCell; |
9 | | -use std::error::Error; |
10 | 10 |
|
11 | 11 | #[cfg(feature = "python")] |
12 | 12 | use pyo3::{exceptions::PyNotImplementedError, prelude::*, types::PyTuple, AsPyPointer}; |
13 | 13 |
|
14 | | -trait NeonMiniJinjaContext { |
15 | | - fn throw_from_mj_error<T>(&mut self, err: mj::Error) -> NeonResult<T>; |
16 | | -} |
17 | | - |
18 | | -impl<'a> NeonMiniJinjaContext for FunctionContext<'a> { |
19 | | - fn throw_from_mj_error<T>(&mut self, err: mj::Error) -> NeonResult<T> { |
20 | | - let codeblock = if let Some(source) = err.template_source() { |
21 | | - let lines: Vec<_> = source.lines().enumerate().collect(); |
22 | | - let idx = err.line().unwrap_or(1).saturating_sub(1); |
23 | | - let skip = idx.saturating_sub(3); |
24 | | - |
25 | | - let pre = lines.iter().skip(skip).take(3.min(idx)).collect::<Vec<_>>(); |
26 | | - let post = lines.iter().skip(idx + 1).take(3).collect::<Vec<_>>(); |
27 | | - |
28 | | - let mut content = "".to_string(); |
29 | | - |
30 | | - for (idx, line) in pre { |
31 | | - content += &format!("{:>4} | {}\r\n", idx + 1, line); |
32 | | - } |
33 | | - |
34 | | - content += &format!("{:>4} > {}\r\n", idx + 1, lines[idx].1); |
35 | | - |
36 | | - if let Some(_span) = err.range() { |
37 | | - // TODO(ovr): improve |
38 | | - content += &format!( |
39 | | - " i {}{} {}\r\n", |
40 | | - " ".repeat(0), |
41 | | - "^".repeat(24), |
42 | | - err.kind(), |
43 | | - ); |
44 | | - } else { |
45 | | - content += &format!(" | {}\r\n", "^".repeat(24)); |
46 | | - } |
47 | | - |
48 | | - for (idx, line) in post { |
49 | | - content += &format!("{:>4} | {}\r\n", idx + 1, line); |
50 | | - } |
51 | | - |
52 | | - format!("{}\r\n{}\r\n{}", "-".repeat(79), content, "-".repeat(79)) |
53 | | - } else { |
54 | | - "".to_string() |
55 | | - }; |
56 | | - |
57 | | - if let Some(next_err) = err.source() { |
58 | | - self.throw_error(format!( |
59 | | - "{} caused by: {:#}\r\n{}", |
60 | | - err, next_err, codeblock |
61 | | - )) |
62 | | - } else { |
63 | | - self.throw_error(format!("{}\r\n{}", err, codeblock)) |
64 | | - } |
65 | | - } |
66 | | -} |
67 | | - |
68 | 14 | struct JinjaEngine { |
69 | 15 | inner: mj::Environment<'static>, |
70 | 16 | } |
|
0 commit comments