Skip to main content

rullst_orm/
intent.rs

1//! Intent-Based Modeling (Auto-generating migrations from Rust doc comments).
2
3/// Intent analyzer for Rust model doc comments.
4pub struct IntentAnalyzer;
5
6impl IntentAnalyzer {
7    /// Parses Rust source code doc-comments (e.g. `/// @index(email)`) and returns recommended migration SQL statements.
8    pub fn analyze_doc_comments(code: &str, table_name: &str) -> Vec<String> {
9        let mut migrations = Vec::new();
10
11        for line in code.lines() {
12            let trimmed = line.trim();
13            if let Some(start) = trimmed.find("@index(") {
14                let rest = &trimmed[start + "@index(".len()..];
15                if let Some(end) = rest.find(')') {
16                    let col = &rest[..end].trim();
17                    let sql = format!(
18                        "CREATE INDEX IF NOT EXISTS idx_{}_{} ON {}({});",
19                        table_name, col, table_name, col
20                    );
21                    migrations.push(sql);
22                }
23            }
24        }
25
26        migrations
27    }
28}
29
30#[cfg(test)]
31mod tests {
32    use super::*;
33
34    #[test]
35    fn test_analyze_doc_comments() {
36        let code = r#"
37        /// User Entity Model
38        /// @index(email)
39        /// @index(created_at)
40        pub struct User {
41            pub email: String,
42        }
43        "#;
44
45        let sqls = IntentAnalyzer::analyze_doc_comments(code, "users");
46        assert_eq!(sqls.len(), 2);
47        assert_eq!(
48            sqls[0],
49            "CREATE INDEX IF NOT EXISTS idx_users_email ON users(email);"
50        );
51        assert_eq!(
52            sqls[1],
53            "CREATE INDEX IF NOT EXISTS idx_users_created_at ON users(created_at);"
54        );
55    }
56}