prax_schema/parser/
grammar.rs

1//! Pest grammar parser for Prax schema files.
2
3use pest_derive::Parser;
4
5/// The Prax schema parser.
6#[derive(Parser)]
7#[grammar = "parser/prax.pest"]
8pub struct PraxParser;
9
10#[cfg(test)]
11mod tests {
12    use super::*;
13    use pest::Parser;
14
15    #[test]
16    fn test_parse_identifier() {
17        let result = PraxParser::parse(Rule::identifier, "User");
18        assert!(result.is_ok());
19    }
20
21    #[test]
22    fn test_parse_field_type() {
23        let result = PraxParser::parse(Rule::field_type, "String?");
24        assert!(result.is_ok());
25
26        let result = PraxParser::parse(Rule::field_type, "Post[]");
27        assert!(result.is_ok());
28    }
29
30    #[test]
31    fn test_parse_attribute() {
32        let result = PraxParser::parse(Rule::field_attribute, "@id");
33        assert!(result.is_ok());
34
35        let result = PraxParser::parse(Rule::field_attribute, "@default(now())");
36        assert!(result.is_ok());
37
38        let result = PraxParser::parse(
39            Rule::field_attribute,
40            "@relation(fields: [author_id], references: [id])",
41        );
42        assert!(result.is_ok());
43    }
44
45    #[test]
46    fn test_parse_model() {
47        let input = r#"model User {
48            id    Int    @id @auto
49            email String @unique
50        }"#;
51        let result = PraxParser::parse(Rule::model_def, input);
52        assert!(result.is_ok(), "Failed to parse model: {:?}", result.err());
53    }
54
55    #[test]
56    fn test_parse_enum() {
57        let input = r#"enum Role {
58            User
59            Admin
60        }"#;
61        let result = PraxParser::parse(Rule::enum_def, input);
62        assert!(result.is_ok());
63    }
64}