mirror of
https://github.com/askama-rs/askama.git
synced 2025-09-29 22:11:17 +00:00
Move most of the code into new askama_shared crate
This makes it possible to share code between askama and askama_derive.
This commit is contained in:
parent
aeac47cee0
commit
9f3b590206
@ -1,2 +1,2 @@
|
||||
[workspace]
|
||||
members = ["askama", "askama_derive", "testing"]
|
||||
members = ["askama", "askama_derive", "askama_shared", "testing"]
|
||||
|
@ -17,17 +17,15 @@ travis-ci = { repository = "djc/askama" }
|
||||
|
||||
[features]
|
||||
default = []
|
||||
serde-json = ["serde", "serde_json"]
|
||||
serde-json = ["askama_shared/serde-json"]
|
||||
with-iron = ["iron", "askama_derive/iron"]
|
||||
with-rocket = ["rocket", "askama_derive/rocket"]
|
||||
|
||||
[dependencies]
|
||||
askama_derive = { path = "../askama_derive", version = "0.3.4" }
|
||||
error-chain = "0.10"
|
||||
askama_shared = { version = "0.3.4", path = "../askama_shared" }
|
||||
iron = { version = "0.5", optional = true }
|
||||
rocket = { version = "0.3", optional = true }
|
||||
serde = { version = "1.0", optional = true }
|
||||
serde_json = { version = "1.0", optional = true }
|
||||
|
||||
[package.metadata.docs.rs]
|
||||
features = [ "serde-json" ]
|
||||
|
@ -213,19 +213,13 @@
|
||||
#![allow(unused_imports)]
|
||||
#[macro_use]
|
||||
extern crate askama_derive;
|
||||
#[macro_use]
|
||||
extern crate error_chain;
|
||||
extern crate askama_shared as shared;
|
||||
|
||||
#[cfg(feature = "serde-json")]
|
||||
extern crate serde;
|
||||
#[cfg(feature = "serde-json")]
|
||||
extern crate serde_json;
|
||||
use shared::path;
|
||||
|
||||
use std::env;
|
||||
use std::fmt;
|
||||
use std::fs::{self, DirEntry};
|
||||
use std::io;
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::path::Path;
|
||||
|
||||
/// Main `Template` trait; implementations are generally derived
|
||||
pub trait Template {
|
||||
@ -239,9 +233,9 @@ pub trait Template {
|
||||
}
|
||||
}
|
||||
|
||||
pub mod filters;
|
||||
pub use shared::filters;
|
||||
pub use askama_derive::*;
|
||||
pub use errors::Result;
|
||||
pub use shared::Result;
|
||||
|
||||
#[cfg(feature = "with-iron")]
|
||||
pub mod iron {
|
||||
@ -258,13 +252,6 @@ pub mod rocket {
|
||||
pub use self::rocket::response::{Responder, Response};
|
||||
}
|
||||
|
||||
// Duplicates askama_derive::path::template_dir()
|
||||
fn template_dir() -> PathBuf {
|
||||
let mut path = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
|
||||
path.push("templates");
|
||||
path
|
||||
}
|
||||
|
||||
fn visit_dirs(dir: &Path, cb: &Fn(&DirEntry)) -> io::Result<()> {
|
||||
if dir.is_dir() {
|
||||
for entry in try!(fs::read_dir(dir)) {
|
||||
@ -290,16 +277,7 @@ fn visit_dirs(dir: &Path, cb: &Fn(&DirEntry)) -> io::Result<()> {
|
||||
/// that have templates, to make sure the crate gets rebuilt when template
|
||||
/// source code changes.
|
||||
pub fn rerun_if_templates_changed() {
|
||||
visit_dirs(&template_dir(), &|e: &DirEntry| {
|
||||
visit_dirs(&path::template_dir(), &|e: &DirEntry| {
|
||||
println!("cargo:rerun-if-changed={}", e.path().to_str().unwrap());
|
||||
}).unwrap();
|
||||
}
|
||||
|
||||
mod errors {
|
||||
error_chain! {
|
||||
foreign_links {
|
||||
Fmt(::std::fmt::Error);
|
||||
Json(::serde_json::Error) #[cfg(feature = "serde-json")];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -13,10 +13,9 @@ proc-macro = true
|
||||
|
||||
[features]
|
||||
default = []
|
||||
iron = []
|
||||
rocket = []
|
||||
iron = ["askama_shared/iron"]
|
||||
rocket = ["askama_shared/rocket"]
|
||||
|
||||
[dependencies]
|
||||
nom = "3"
|
||||
quote = "0.3"
|
||||
askama_shared = { version = "0.3.4", path = "../askama_shared" }
|
||||
syn = "0.11"
|
||||
|
@ -1,7 +1,5 @@
|
||||
#[macro_use]
|
||||
extern crate nom;
|
||||
extern crate askama_shared as shared;
|
||||
extern crate proc_macro;
|
||||
extern crate quote;
|
||||
extern crate syn;
|
||||
|
||||
use proc_macro::TokenStream;
|
||||
@ -9,10 +7,6 @@ use proc_macro::TokenStream;
|
||||
use std::borrow::Cow;
|
||||
use std::path::PathBuf;
|
||||
|
||||
mod generator;
|
||||
mod parser;
|
||||
mod path;
|
||||
|
||||
#[proc_macro_derive(Template, attributes(template))]
|
||||
pub fn derive_template(input: TokenStream) -> TokenStream {
|
||||
let ast = syn::parse_derive_input(&input.to_string()).unwrap();
|
||||
@ -35,16 +29,16 @@ fn build_template(ast: &syn::DeriveInput) -> String {
|
||||
let (path, src) = match meta.source {
|
||||
Source::Source(s) => (PathBuf::new(), Cow::Borrowed(s)),
|
||||
Source::Path(s) => {
|
||||
let path = path::find_template_from_path(&s, None);
|
||||
let src = path::get_template_source(&path);
|
||||
let path = shared::path::find_template_from_path(&s, None);
|
||||
let src = shared::path::get_template_source(&path);
|
||||
(path, Cow::Owned(src))
|
||||
},
|
||||
};
|
||||
let nodes = parser::parse(src.as_ref());
|
||||
let nodes = shared::parse(src.as_ref());
|
||||
if meta.print == Print::Ast || meta.print == Print::All {
|
||||
println!("{:?}", nodes);
|
||||
}
|
||||
let code = generator::generate(ast, &path, nodes);
|
||||
let code = shared::generate(ast, &path, nodes);
|
||||
if meta.print == Print::Code || meta.print == Print::All {
|
||||
println!("{}", code);
|
||||
}
|
||||
|
19
askama_shared/Cargo.toml
Normal file
19
askama_shared/Cargo.toml
Normal file
@ -0,0 +1,19 @@
|
||||
[package]
|
||||
name = "askama_shared"
|
||||
version = "0.3.4"
|
||||
authors = ["Dirkjan Ochtman <dirkjan@ochtman.nl>"]
|
||||
workspace = ".."
|
||||
|
||||
[features]
|
||||
default = []
|
||||
serde-json = ["serde", "serde_json"]
|
||||
iron = []
|
||||
rocket = []
|
||||
|
||||
[dependencies]
|
||||
error-chain = "0.10"
|
||||
nom = "3"
|
||||
quote = "0.3"
|
||||
serde = { version = "1.0", optional = true }
|
||||
serde_json = { version = "1.0", optional = true }
|
||||
syn = "0.11"
|
29
askama_shared/src/lib.rs
Normal file
29
askama_shared/src/lib.rs
Normal file
@ -0,0 +1,29 @@
|
||||
#[macro_use]
|
||||
extern crate error_chain;
|
||||
#[macro_use]
|
||||
extern crate nom;
|
||||
extern crate quote;
|
||||
extern crate syn;
|
||||
|
||||
#[cfg(feature = "serde-json")]
|
||||
extern crate serde;
|
||||
#[cfg(feature = "serde-json")]
|
||||
extern crate serde_json;
|
||||
|
||||
pub use errors::Result;
|
||||
pub mod filters;
|
||||
pub mod path;
|
||||
pub use parser::parse;
|
||||
pub use generator::generate;
|
||||
|
||||
mod generator;
|
||||
mod parser;
|
||||
|
||||
mod errors {
|
||||
error_chain! {
|
||||
foreign_links {
|
||||
Fmt(::std::fmt::Error);
|
||||
Json(::serde_json::Error) #[cfg(feature = "serde-json")];
|
||||
}
|
||||
}
|
||||
}
|
@ -43,8 +43,7 @@ pub fn find_template_from_path<'a>(path: &str, start_at: Option<&Path>) -> PathB
|
||||
}
|
||||
}
|
||||
|
||||
// Duplicated in askama
|
||||
fn template_dir() -> PathBuf {
|
||||
pub fn template_dir() -> PathBuf {
|
||||
let mut path = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
|
||||
path.push("templates");
|
||||
path
|
Loading…
x
Reference in New Issue
Block a user