This-RS 🦀
A generic entity and relationship management framework for building RESTful APIs in Rust with zero boilerplate.
✨ Highlights
- 🔌 Generic Entity System - Add entities without modifying framework code
- 🤖 Auto-Generated Routes - Declare a module, routes are created automatically
- 🔗 Flexible Relationships - Multiple link types between same entities
- ↔️ Bidirectional Navigation - Query relationships from both directions
- ✨ Auto-Enriched Links - Full entities in responses, no N+1 queries
- 🏗️ Macro-Driven Entities - Define entities with zero boilerplate using macros
- 🎯 Smart Entity Creation - Create new entities + links in one API call
- 📝 Auto-Pluralization - Smart plural forms (company → companies)
- ⚙️ YAML Configuration - Declarative entity and link definitions
- 🔒 Type-Safe - Full Rust compile-time guarantees
🎯 The Vision
Traditional Framework (❌)
// Add new entity = Modify 10+ files
// - Update routing module (30+ lines)
// - Modify link handlers
// - Update entity registry
// - Write CRUD boilerplate
// - Maintain consistency manually
This-RS (✅)
// Add new entity = Just use a macro!
impl_data_entity!;
// Main.rs stays unchanged!
let app = new
.register_module? // ← Everything auto-generated
.build?;
Result: Zero boilerplate, maximum productivity.
🚀 Quick Example
1. Define Your Entity with Macros
use *;
// Macro generates full entity with all base fields
impl_data_entity!;
// Automatically includes:
// - id: Uuid (auto-generated)
// - type: String (auto-set to "product")
// - name: String (required)
// - created_at: DateTime<Utc> (auto-generated)
// - updated_at: DateTime<Utc> (auto-managed)
// - deleted_at: Option<DateTime<Utc>> (soft delete)
// - status: String (required)
2. Create Entity Store with EntityCreator
use *;
// Implement EntityFetcher for link enrichment
// Implement EntityCreator for automatic entity creation
3. Create Module
4. Launch Server (Auto-Generated Routes!)
async
That's it! Routes are auto-generated:
- ✅
GET /products- List all - ✅
POST /products- Create new product - ✅
GET /products/:id- Get by ID - ✅
PUT /products/:id- Update product - ✅
DELETE /products/:id- Delete product - ✅
GET /products/:id/links- Introspection - ✅ Link routes (if configured in YAML)
🔗 Advanced Link Features
Two Ways to Create Links
1. Link Existing Entities
# POST /orders/{order_id}/invoices/{invoice_id}
2. Create New Entity + Link Automatically
# POST /orders/{order_id}/invoices
# Response includes both created entity AND link!
{
}
Auto-Enriched Link Responses
When you query links, you automatically get full entity data:
# GET /orders/{id}/invoices
{
{
}
}
No N+1 queries! Entities are fetched efficiently in the background.
📚 Examples
Microservice Example
Complete billing microservice with auto-generated routes:
Output:
🚀 Starting billing-service v1.0.0
📦 Entities: ["order", "invoice", "payment"]
🌐 Server running on http://127.0.0.1:3000
📚 Entity Routes (CRUD - Auto-generated):
GET /orders - List all orders
POST /orders - Create a new order
GET /orders/{id} - Get a specific order
PUT /orders/{id} - Update an order
DELETE /orders/{id} - Delete an order
🔗 Link Routes (Auto-generated):
GET /orders/{id}/invoices - List invoices for an order
POST /orders/{id}/invoices - Create new invoice + link automatically
POST /orders/{id}/invoices/{inv_id} - Link existing order & invoice
PUT /orders/{id}/invoices/{inv_id} - Update link metadata
DELETE /orders/{id}/invoices/{inv_id} - Delete link
See examples/microservice/README.md for full details.
🏗️ Architecture
Entity Hierarchy
Entity (Base Trait)
├── id: Uuid
├── type: String
├── created_at: DateTime<Utc>
├── updated_at: DateTime<Utc>
├── deleted_at: Option<DateTime<Utc>>
└── status: String
├─► Data (Inherits Entity)
│ └── name: String
│ + indexed_fields()
│ + field_value()
│
└─► Link (Inherits Entity)
├── source_id: Uuid
├── target_id: Uuid
└── link_type: String
Core Concepts
- ServerBuilder - Fluent API for building HTTP servers
- EntityDescriptor - Describes how to generate routes for an entity
- EntityRegistry - Collects and builds all entity routes
- Module - Groups related entities with configuration
- LinkService - Generic relationship management
- EntityFetcher - Dynamically fetch entities for link enrichment
- EntityCreator - Dynamically create entities with automatic linking
Macro System
impl_data_entity!- Generate a complete Data entityimpl_link_entity!- Generate a custom Link entityentity_fields!- Inject base Entity fieldsdata_fields!- Inject Entity + name fieldslink_fields!- Inject Entity + link fields
📖 Documentation
- Quick Start - Fast introduction
- Getting Started - Step-by-step tutorial
- Enriched Links - Auto-enrichment & performance
- Architecture - Technical deep dive
- ServerBuilder - Auto-routing details
- Full Documentation - Complete documentation index
🎁 Key Benefits
For Developers
✅ -88% less boilerplate (340 → 40 lines in main.rs)
✅ Add entity in minutes - Just one macro call
✅ Consistent patterns - Same structure for all entities
✅ Type-safe - Full Rust compile-time checks
✅ Scalable - 3 or 300 entities = same simplicity
For Teams
✅ Faster development - Less code to write and maintain
✅ Easier onboarding - Clear patterns and conventions
✅ Reduced errors - Less manual work = fewer mistakes
✅ Better consistency - Framework enforces best practices
For Production
✅ Authorization - Declarative auth policies
✅ Configurable - YAML-based configuration
✅ Extensible - Plugin architecture via modules
✅ Performance - Efficient link enrichment with no N+1 queries
✅ Soft Deletes - Built-in soft delete support
🤝 Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
📄 License
This project is licensed under the MIT License - see the LICENSE-MIT file for details.
🌟 Why This-RS?
"The best code is the code you don't have to write."
This-RS eliminates boilerplate while maintaining type safety and flexibility. Perfect for:
- 🏢 Microservices architectures
- 🔌 REST APIs with complex relationships
- 🚀 Rapid prototyping
- 📊 Data-rich applications with interconnected entities
Built with Rust. Designed for productivity. Ready for production. 🦀✨