elif_codegen/
templates.rs1use 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"#;