Prelude Pre-import
Prelude Pre-import Pattern
To improve development efficiency, reduce boilerplate code, and unify code style, our project extensively uses the Prelude pattern. You'll find a prelude.rs file under both model and service modules.
Core Concept
Centralize the most commonly used types, traits, and functions within a module into a prelude.rs file for public export. Other files in the module just need use crate::module::prelude::*; to import all necessary dependencies.
Why Use the Prelude Pattern?
Before Prelude, each service/model file might start with many use statements:
// Verbose import list
use crate::common::error::{Error, Result};
use crate::common::ApiResponse;
use crate::DB;
use sea_orm::{EntityTrait, QueryFilter, Set, ActiveModelTrait};
use serde::Serialize;
use tracing::info;With Prelude:
// Clean, unified import
use crate::service::prelude::*;1. model::prelude - Foundation of Data Models
Exports core tools for data definition, database operations, and serialization:
- SeaORM:
EntityTrait,ModelTrait,ActiveModelTrait,QueryFilter,ColumnTrait,Condition,DatabaseConnection,DbErr,PaginatorTrait - Serde:
Serialize,Deserialize - Axum:
IntoResponse - Project Components:
Error,Result,ApiResponse,VJson,VQuery,DB,GID
2. service::prelude - Business Logic Hub
Exports everything from model::prelude plus:
- Service-level helpers and macros
- Common service functions
Usage
use crate::service::prelude::*;
pub struct UserService;
impl UserService {
pub async fn find_user_by_id(user_id: i64) -> Result<Option<model::user::Model>> {
let db = DB.get().unwrap();
let user = model::user::Entity::find_by_id(user_id).one(db).await?;
Ok(user)
}
}Best Practices
Important: About * (Glob Import)
In regular Rust code, wildcard imports are often not recommended. However, in the Prelude pattern, * import is recommended and idiomatic.
- When to add to Prelude? When a type/trait is used in over 80% of files in the same module.
- When not to add? Types used in only one or two files.
- Follow hierarchy:
modelfiles usemodel::prelude::*;servicefiles useservice::prelude::*.