valence_codegen/codegen/parser/
mod.rs1mod lower;
7
8use valence_core::SchemaConnection;
9use valence_schema_dsl::{parse_schema_file, parse_trait_file, ParsedPolicies, ParsedSchema};
10
11pub use lower::{lower_parsed_schema, lower_parsed_trait};
12
13#[derive(Debug, Clone)]
15pub struct ParsedTraitDef {
16 pub name: String,
17 pub fields: Vec<valence_core::SchemaField>,
18 pub connections: Vec<SchemaConnection>,
19}
20
21#[derive(Debug, Clone)]
23pub struct ParsedSchemaFile {
24 pub schema: valence_core::Schema,
25 pub database: Option<syn::Expr>,
26 pub policies: Option<ParsedPolicies>,
27 pub field_policies: Vec<Option<ParsedPolicies>>,
29}
30
31pub fn extract_schema_from_macro(
33 content: &str,
34) -> Result<ParsedSchemaFile, Box<dyn std::error::Error>> {
35 let parsed: ParsedSchema = parse_schema_file(content).map_err(|e| e.message)?;
36 if let Some(expr) = &parsed.database {
37 if matches!(
38 expr,
39 syn::Expr::Lit(syn::ExprLit {
40 lit: syn::Lit::Str(_),
41 ..
42 })
43 ) {
44 return Err(
45 "`database:` cannot be a string literal (no stable address for `&dyn DatabaseEvaluator`). \
46Use a named `const` / `static` evaluator instead."
47 .into(),
48 );
49 }
50 }
51 let field_policies = parsed.fields.iter().map(|f| f.policies.clone()).collect();
52 Ok(ParsedSchemaFile {
53 schema: lower_parsed_schema(&parsed),
54 database: parsed.database,
55 policies: parsed.policies,
56 field_policies,
57 })
58}
59
60pub fn extract_trait_from_file(
62 content: &str,
63) -> Result<ParsedTraitDef, Box<dyn std::error::Error>> {
64 let parsed = parse_trait_file(content).map_err(|e| e.message)?;
65 Ok(lower_parsed_trait(&parsed))
66}
67
68#[cfg(test)]
69mod parser_tests;