8个版本 (4个重大更新)

0.5.3 2023年12月11日
0.5.2 2023年11月30日
0.4.0 2023年11月21日
0.3.0 2023年11月21日
0.1.0 2023年11月20日

模板引擎中排名第151

Download history 1502/week @ 2024-03-14 1889/week @ 2024-03-21 1849/week @ 2024-03-28 1940/week @ 2024-04-04 1636/week @ 2024-04-11 1844/week @ 2024-04-18 2021/week @ 2024-04-25 2377/week @ 2024-05-02 2727/week @ 2024-05-09 2205/week @ 2024-05-16 2548/week @ 2024-05-23 3527/week @ 2024-05-30 3299/week @ 2024-06-06 4001/week @ 2024-06-13 4445/week @ 2024-06-20 3632/week @ 2024-06-27

每月下载量15,883
5包中使用(2个直接使用)

Apache-2.0

18KB
263 代码行

rrgen

声明式代码生成和注入的微型框架。

入门

模板使用Tera作为模板语言(类似于liquid),并使用特殊的元数据/主体分离frontmatter

模板的第一部分指示模板应该做什么,以及应该执行哪些injections

第二部分是实际要生成的目标文件。

示例模板controller.t

---
to: tests/fixtures/realistic/generated/controllers/{{name | snake_case }}.rs
injections:
- into: tests/fixtures/realistic/generated/controllers/mod.rs
  append: true
  content: "pub mod {{ name | snake_case }};"
- into: tests/fixtures/realistic/generated/app.rs
  after: "AppRoutes::"
  content: "            .add_route(controllers::{{ name | snake_case }}::routes())"
---
#![allow(clippy::unused_async)]
use axum::{extract::State, routing::get};
use rustyrails::{
    app::AppContext,
    controller::{format, Routes},
    Result,
};

pub async fn echo(req_body: String) -> String {
    req_body
}

pub async fn hello(State(ctx): State<AppContext>) -> Result<String> {
    // do something with context (database, etc)
    format::text("hello")
}

pub fn routes() -> Routes {
    Routes::new()
        .prefix("{{ name | snake_case }}")
        .add("/", get(hello))
        .add("/echo", get(echo))
}

渲染模板将创建一个或多个文件,可能注入到文件中,操作方式如下

use std::fs;
use rrgen::Rgen;
use serde_json::json;

let rrgen = RRgen::default();
let vars = json!({"name": "post"});

rrgen.generate(
    &fs::read_to_string("tests/fixtures/test1/template.t").unwrap(),
    &vars,
)
.unwrap();

vars将是同时暴露给frontmatter部分和body部分的变量。

依赖项

~9–18MB
~249K SLoC