mirror of
https://github.com/askama-rs/askama.git
synced 2025-10-02 15:25:19 +00:00
Implement Render
even if parsing failed
This makes error messages much more readable.
This commit is contained in:
parent
a95fca43ac
commit
c48532fb17
@ -36,7 +36,7 @@ impl Heritage<'_> {
|
|||||||
|
|
||||||
type BlockAncestry<'a> = HashMap<&'a str, Vec<(&'a Context<'a>, &'a BlockDef<'a>)>>;
|
type BlockAncestry<'a> = HashMap<&'a str, Vec<(&'a Context<'a>, &'a BlockDef<'a>)>>;
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Default, Clone)]
|
||||||
pub(crate) struct Context<'a> {
|
pub(crate) struct Context<'a> {
|
||||||
pub(crate) nodes: &'a [Node<'a>],
|
pub(crate) nodes: &'a [Node<'a>],
|
||||||
pub(crate) extends: Option<Rc<Path>>,
|
pub(crate) extends: Option<Rc<Path>>,
|
||||||
|
@ -332,6 +332,14 @@ impl TemplateArgs {
|
|||||||
Ok(args)
|
Ok(args)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn fallback() -> Self {
|
||||||
|
Self {
|
||||||
|
source: Some(Source::Source("".to_string())),
|
||||||
|
ext: Some("txt".to_string()),
|
||||||
|
..Self::default()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) fn config(&self) -> Result<String, CompileError> {
|
pub(crate) fn config(&self) -> Result<String, CompileError> {
|
||||||
read_config_file(self.config.as_deref())
|
read_config_file(self.config.as_deref())
|
||||||
}
|
}
|
||||||
|
@ -23,10 +23,26 @@ pub fn derive_template(input: TokenStream) -> TokenStream {
|
|||||||
let ast = syn::parse::<syn::DeriveInput>(input).unwrap();
|
let ast = syn::parse::<syn::DeriveInput>(input).unwrap();
|
||||||
match build_template(&ast) {
|
match build_template(&ast) {
|
||||||
Ok(source) => source.parse().unwrap(),
|
Ok(source) => source.parse().unwrap(),
|
||||||
Err(e) => e.into_compile_error(),
|
Err(e) => {
|
||||||
|
let mut e = e.into_compile_error();
|
||||||
|
if let Ok(source) = build_skeleton(&ast) {
|
||||||
|
let source: TokenStream = source.parse().unwrap();
|
||||||
|
e.extend(source);
|
||||||
|
}
|
||||||
|
e
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn build_skeleton(ast: &syn::DeriveInput) -> Result<String, CompileError> {
|
||||||
|
let template_args = TemplateArgs::fallback();
|
||||||
|
let config = Config::new("", None)?;
|
||||||
|
let input = TemplateInput::new(ast, &config, &template_args)?;
|
||||||
|
let mut contexts = HashMap::new();
|
||||||
|
contexts.insert(&input.path, Context::default());
|
||||||
|
Generator::new(&input, &contexts, None, MapChain::default()).build(&contexts[&input.path])
|
||||||
|
}
|
||||||
|
|
||||||
/// Takes a `syn::DeriveInput` and generates source code for it
|
/// Takes a `syn::DeriveInput` and generates source code for it
|
||||||
///
|
///
|
||||||
/// Reads the metadata from the `template()` attribute to get the template
|
/// Reads the metadata from the `template()` attribute to get the template
|
||||||
|
@ -6,16 +6,3 @@ error: failed to parse template source at row 1, column 27 near:
|
|||||||
| ^^^^^^^^
|
| ^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: this error originates in the derive macro `Template` (in Nightly builds, run with -Z macro-backtrace for more info)
|
= note: this error originates in the derive macro `Template` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
error[E0599]: no method named `render` found for struct `A` in the current scope
|
|
||||||
--> tests/ui/filter_block_ws.rs:11:7
|
|
||||||
|
|
|
||||||
8 | struct A;
|
|
||||||
| -------- method `render` not found for this struct
|
|
||||||
...
|
|
||||||
11 | A.render().unwrap();
|
|
||||||
| ^^^^^^ method not found in `A`
|
|
||||||
|
|
|
||||||
= help: items from traits can only be used if the trait is implemented and in scope
|
|
||||||
= note: the following trait defines an item `render`, perhaps you need to implement it:
|
|
||||||
candidate #1: `Template`
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user