aboutsummaryrefslogtreecommitdiffstats
path: root/askama_derive/src
diff options
context:
space:
mode:
authorLibravatar Maarten de Vries <maarten@de-vri.es>2019-01-10 20:42:39 +0100
committerLibravatar Dirkjan Ochtman <dirkjan@ochtman.nl>2019-01-11 16:30:51 +0100
commit07904728f9708de152beea49ce67cafcd7225aa2 (patch)
tree93b9dcce32ec6a1f2a4d5fa0fd55116aa0a3be7b /askama_derive/src
parent7f6263ceddd6586ef2e65a5cbde5ee6555a43c23 (diff)
downloadaskama-07904728f9708de152beea49ce67cafcd7225aa2.tar.gz
askama-07904728f9708de152beea49ce67cafcd7225aa2.tar.bz2
askama-07904728f9708de152beea49ce67cafcd7225aa2.zip
Inject template file into generated source as bytes.
This is meant to allow the compiler to understand the dependency between the generated code and the template source. It removes the need for a build script.
Diffstat (limited to 'askama_derive/src')
-rw-r--r--askama_derive/src/generator.rs26
1 files changed, 25 insertions, 1 deletions
diff --git a/askama_derive/src/generator.rs b/askama_derive/src/generator.rs
index 288ddae..16a08bb 100644
--- a/askama_derive/src/generator.rs
+++ b/askama_derive/src/generator.rs
@@ -1,5 +1,5 @@
use super::{get_template_source, Context, Heritage};
-use crate::input::TemplateInput;
+use crate::input::{Source, TemplateInput};
use crate::parser::{
Cond, Expr, MatchParameter, MatchParameters, MatchVariant, Node, Target, When, WS,
};
@@ -108,6 +108,21 @@ impl<'a> Generator<'a> {
::askama::Result<()> {",
);
+ // Make sure the compiler understands that the generated code depends on the template files.
+ for (path, _) in self.contexts {
+ // Skip the fake path of templates defined in rust source.
+ let path_is_valid = match self.input.source {
+ Source::Path(_) => true,
+ Source::Source(_) => *path != &self.input.path,
+ };
+ if path_is_valid {
+ let path = path.to_str().unwrap();
+ buf.writeln(&quote! {
+ include_bytes!(#path);
+ }.to_string());
+ }
+ }
+
if let Some(heritage) = self.heritage {
self.handle(heritage.root, heritage.root.nodes, buf, AstLevel::Top);
} else {
@@ -559,6 +574,15 @@ impl<'a> Generator<'a> {
.find_template(path, Some(&self.input.path));
let src = get_template_source(&path);
let nodes = parse(&src, self.input.syntax);
+
+ // Make sure the compiler understands that the generated code depends on the template file.
+ {
+ let path = path.to_str().unwrap();
+ buf.writeln(&quote! {
+ include_bytes!(#path);
+ }.to_string());
+ }
+
{
// Since nodes must not outlive the Generator, we instantiate
// a nested Generator here to handle the include's nodes.