rrgen

Crates.iorrgen
lib.rsrrgen
version0.5.3
sourcesrc
created_at2023-11-20 12:25:48.317977
updated_at2023-12-11 19:41:42.837078
descriptionA microframework for declarative code generation and injection
homepage
repositoryhttps://github.com/jondot/rrgen
max_upload_size
id1042039
size59,848
Dotan J. Nahum (jondot)

documentation

https://docs.rs/rrgen

README

rrgen

A microframework for declarative code generation and injection.

Getting started

Templates use Tera as a templating language (similar to liquid), and use a special metadata/body separation with frontmatter.

The first part of the template instructs what the template should do, and which injections it should perform.

The second part is the actual target file that's being generated.

Example template 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))
}

Rendering a template will create one or more files, potentially inject into files, and is done like so:

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 will be variables that are exposed both for the frontmatter part and the body part.

Commit count: 17

cargo fmt