Architecture of a Runique Project
A Runique project is a standard Rust binary crate. runique new generates the base structure, which you evolve as needed.
Project structure
my-project/
βββ src/
β βββ entities/ # Model declarations
β β βββ users.rs # Uses Runique AST for the makemigrations CLI
β β βββ blog.rs # CLI is not compatible with plain structs
β β
β βββ formulaire/ # Form declarations
β β βββ inscription.rs # Using the form engine
β β βββ blog.rs # or proc-attribute macros
β β
β βββ main.rs # Entry point β RuniqueApp builder
β βββ admin.rs # admin!{} declaration (if admin enabled, required for runique start)
β βββ urls.rs # urlpatterns! β routing table
β βββ views.rs # Handlers (async functions)
β βββ forms.rs # RuniqueForm structs (or forms/ folder)
β
βββ templates/ # Tera templates (.html)
βββ static/ # Static files (CSS, JS, images)
β βββ media/ # Uploads (FileField)
β # media/ can be placed in another folder
β
βββ migration/ # SeaORM migrations
β βββ src/
β βββ lib.rs
βββ .env # Environment variables
βββ Cargo.toml
Role of each file
main.rs β Configures and starts the application via the builder:
#[macro_use]
extern crate runique;
use runique::prelude::*;
mod entities;
mod formulaire;
mod urls;
mod views;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let config = RuniqueConfig::from_env();
let db_config = DatabaseConfig::from_env()?.min_connections(1).build();
let db: DatabaseConnection = db_config.connect().await?;
password_init(PasswordConfig::auto());
RuniqueApp::builder(config)
.routes(urls::routes())
.with_database(db)
.statics()
.build()
.await?
.run()
.await?;
Ok(())
}
urls.rs β Declares routes via urlpatterns!:
use runique::prelude::*;
use crate::views;
pub fn routes() -> Router {
urlpatterns! {
"/" => view!{ views::index }, name = "index",
"/register" => view!{ views::register }, name = "register",
}
}
views.rs β Request handlers:
pub async fn index(mut request: Request) -> AppResult<Response> {
context_update!(request => { "title" => "Home" });
request.render("index.html")
}
formulaire/ β Typed forms:
pub struct RegisterForm { pub form: Forms }
impl RuniqueForm for RegisterForm {
fn register_fields(form: &mut Forms) {
form.field(&TextField::text("username").label("Username").required());
form.field(&TextField::email("email").label("Email").required());
}
impl_form_access!();
}
admin.rs β Admin view declaration (files generated into src/admins/):
admin! {
users: users::Model => RegisterForm {
title: "Users",
permissions: ["admin"],
}
}
Starting a new project
runique new my-project
cd my-project
runique start
runique new generates the minimal structure above. What to edit and what to leave alone:
| File / folder | Edit? | Role |
|---|---|---|
src/main.rs | Yes | Configures the builder and declares modules |
src/urls.rs | Yes | Routing table |
src/views.rs | Yes | Request handlers |
src/entities/ | Yes | Model declarations (Runique AST, compatible with makemigrations) |
src/formulaire/ | Yes | Forms and validation |
src/admin.rs | Yes (if admin) | admin!{} declaration, required for runique start |
src/admins/ | No | Generated by the daemon β do not edit manually |
templates/ | Yes | Tera templates |
static/ | Yes | CSS, JS, images |
migration/ | No (unless adding tables) | SeaORM migrations |
.env | Yes | Environment variables |
runique startwatchessrc/admin.rsand regeneratessrc/admins/on every change. For apps without an admin view,cargo runis sufficient.
Framework internal structure
runique/src/
βββ app/ # App Builder, Templates & Intelligent Builder
β βββ builder.rs # RuniqueAppBuilder with slots
β βββ error_build.rs # Build errors
β βββ templates.rs # TemplateLoader (Tera)
β βββ staging/ # Staging structs
β βββ core_staging.rs
β βββ middleware_staging.rs
β βββ static_staging.rs
βββ config/ # Configuration & Settings
βββ context/ # Request Context & Tera tools
β βββ request.rs # Request struct (extractor)
β βββ tera/ # Tera filters and functions
βββ db/ # ORM & Database
βββ engine/ # RuniqueEngine
βββ errors/ # Error handling
βββ flash/ # Flash messages
βββ forms/ # Form system
βββ macros/ # Utility macros
β βββ context_macro/ # context!, context_update!
β βββ flash_message/ # success!, error!, info!, warning!, flash_now!
β βββ router/ # urlpatterns!, view!, impl_objects!
βββ middleware/ # Middleware (Security)
β βββ security/ # CSRF, CSP, Host, Cache, Error Handler
βββ utils/ # Utilities
βββ lib.rs
βββ prelude.rs