Skip to main content

oparry_parser/
rust.rs

1//! Rust parser using Syn
2
3use oparry_core::{Error, Result};
4use syn::{File, parse_file};
5
6/// Rust AST
7#[derive(Debug)]
8pub struct RustAst {
9    source: String,
10    file: File,
11}
12
13impl RustAst {
14    /// Create new Rust AST
15    pub fn new(source: String, file: File) -> Self {
16        Self { source, file }
17    }
18
19    /// Get source code
20    pub fn source(&self) -> &str {
21        &self.source
22    }
23
24    /// Get the syn File
25    pub fn file(&self) -> &File {
26        &self.file
27    }
28}
29
30/// Rust parser
31pub struct RustParser;
32
33impl RustParser {
34    /// Create new parser
35    pub fn new() -> Self {
36        Self
37    }
38}
39
40impl Default for RustParser {
41    fn default() -> Self {
42        Self::new()
43    }
44}
45
46impl super::Parser for RustParser {
47    fn parse(&self, source: &str) -> Result<super::ParsedCode> {
48        let file = parse_file(source).map_err(|e| oparry_core::Error::Parse {
49            file: "<unknown>".to_string(),
50            line: 0,
51            column: 0,
52            message: e.to_string(),
53        })?;
54
55        Ok(super::ParsedCode::Rust(RustAst::new(source.to_string(), file)))
56    }
57}
58
59#[cfg(test)]
60mod tests {
61    use super::*;
62    use crate::Parser;
63
64    #[test]
65    fn test_parse_rust() {
66        let parser = RustParser::new();
67        let source = r#"
68            fn hello(name: &str) -> String {
69                format!("Hello {}", name)
70            }
71        "#;
72
73        let result = parser.parse(source);
74        assert!(result.is_ok());
75    }
76
77    #[test]
78    fn test_parse_rust_struct() {
79        let parser = RustParser::new();
80        let source = r#"
81            struct User {
82                name: String,
83                age: u32,
84            }
85
86            impl User {
87                fn new(name: String) -> Self {
88                    Self { name, age: 0 }
89                }
90            }
91        "#;
92
93        let result = parser.parse(source);
94        assert!(result.is_ok());
95    }
96}