elif_codegen/
templates.rs

1use elif_core::ElifError;
2use std::collections::HashMap;
3
4pub fn render_template(template: &str, context: &HashMap<&str, String>) -> Result<String, ElifError> {
5    let mut result = template.to_string();
6    
7    for (key, value) in context {
8        let placeholder = format!("{{{{{}}}}}", key);
9        result = result.replace(&placeholder, value);
10    }
11    
12    Ok(result)
13}
14
15pub static MODEL_TEMPLATE: &str = r#"use serde::{Deserialize, Serialize};
16use sqlx::FromRow;
17use uuid::Uuid;
18use chrono::{DateTime, Utc};
19
20#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
21pub struct {{name}} {
22    {{fields}}
23}
24
25#[derive(Debug, Clone, Serialize, Deserialize)]
26pub struct Create{{name}} {
27    {{fields}}
28}
29
30#[derive(Debug, Clone, Serialize, Deserialize)]
31pub struct Update{{name}} {
32    {{fields}}
33}
34"#;
35
36pub static HANDLER_TEMPLATE: &str = r#"use elif_http::{
37    ElifRouter, ElifResponse, ElifJson, ElifPath,
38    HttpResult, HttpError, StatusCode,
39};
40use serde_json::Value;
41use uuid::Uuid;
42
43pub fn router() -> ElifRouter {
44    ElifRouter::new()
45        .post("/", create_{{name}})
46        .get("/", list_{{name}})
47        .get("/:id", get_{{name}})
48        .patch("/:id", update_{{name}})
49        .delete("/:id", delete_{{name}})
50}
51
52// <<<ELIF:BEGIN agent-editable:create_{{name}}>>>
53async fn create_{{name}}(
54    payload: Value,
55) -> HttpResult<ElifResponse> {
56    // TODO: Implement create logic
57    Ok(ElifResponse::json(serde_json::json!({"id": "placeholder"}))
58        .with_status(StatusCode::CREATED))
59}
60// <<<ELIF:END agent-editable:create_{{name}}>>>
61
62// <<<ELIF:BEGIN agent-editable:list_{{name}}>>>
63async fn list_{{name}}() -> HttpResult<ElifResponse> {
64    // TODO: Implement list logic
65    Ok(ElifResponse::json(serde_json::json!({"items": [], "next": null}))
66        .with_status(StatusCode::OK))
67}
68// <<<ELIF:END agent-editable:list_{{name}}>>>
69
70// <<<ELIF:BEGIN agent-editable:get_{{name}}>>>
71async fn get_{{name}}(
72    id: Uuid,
73) -> HttpResult<ElifResponse> {
74    // TODO: Implement get logic
75    Ok(ElifResponse::json(serde_json::json!({"id": id}))
76        .with_status(StatusCode::OK))
77}
78// <<<ELIF:END agent-editable:get_{{name}}>>>
79
80// <<<ELIF:BEGIN agent-editable:update_{{name}}>>>
81async fn update_{{name}}(
82    id: Uuid,
83    payload: Value,
84) -> HttpResult<ElifResponse> {
85    // TODO: Implement update logic
86    Ok(ElifResponse::json(serde_json::json!({"id": id}))
87        .with_status(StatusCode::OK))
88}
89// <<<ELIF:END agent-editable:update_{{name}}>>>
90
91// <<<ELIF:BEGIN agent-editable:delete_{{name}}>>>
92async fn delete_{{name}}(
93    id: Uuid,
94) -> HttpResult<ElifResponse> {
95    // TODO: Implement delete logic
96    Ok(ElifResponse::empty().with_status(StatusCode::NO_CONTENT))
97}
98// <<<ELIF:END agent-editable:delete_{{name}}>>>
99"#;
100
101pub static MIGRATION_TEMPLATE: &str = r#"CREATE TABLE {{table}} (
102{{fields}}
103);
104
105{{indexes}}
106"#;
107
108pub static TEST_TEMPLATE: &str = r#"use elif_http::{StatusCode, ElifResponse};
109use elif_core::{Container, container::test_implementations::*};
110use serde_json::json;
111use std::sync::Arc;
112
113#[tokio::test]
114async fn test_{{name}}_crud() {
115    // Setup test container with DI services
116    let config = Arc::new(create_test_config());
117    let database = Arc::new(TestDatabase::new()) as Arc<dyn elif_core::DatabaseConnection>;
118    
119    let _container = Container::builder()
120        .config(config)
121        .database(database)
122        .build()
123        .unwrap();
124    
125    // TODO: Create test server using framework abstractions
126    // let server = TestServer::new(create_app()).unwrap();
127    
128    // Test create
129    // let response = server
130    //     .post("{{route}}")
131    //     .json(&json!({"title": "Test item"}))
132    //     .await;
133    // 
134    // assert_eq!(response.status_code(), StatusCode::CREATED);
135    
136    // Test list
137    // let response = server.get("{{route}}").await;
138    // assert_eq!(response.status_code(), StatusCode::OK);
139    
140    // For now, basic assertion to verify test compiles
141    assert!(true, "Framework-native test template");
142}
143"#;