1use oparry_core::{Error, Result};
4use syn::{File, parse_file};
5
6#[derive(Debug)]
8pub struct RustAst {
9 source: String,
10 file: File,
11}
12
13impl RustAst {
14 pub fn new(source: String, file: File) -> Self {
16 Self { source, file }
17 }
18
19 pub fn source(&self) -> &str {
21 &self.source
22 }
23
24 pub fn file(&self) -> &File {
26 &self.file
27 }
28}
29
30pub struct RustParser;
32
33impl RustParser {
34 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}