spacetimedb_codegen/
lib.rs1use spacetimedb_schema::def::{ModuleDef, ReducerDef, ScopedTypeName, TableDef, TypeDef};
2use spacetimedb_schema::identifier::Identifier;
3
4mod code_indenter;
5pub mod csharp;
6pub mod rust;
7pub mod typescript;
8mod util;
9
10pub use self::csharp::Csharp;
11pub use self::rust::Rust;
12pub use self::typescript::TypeScript;
13pub use util::AUTO_GENERATED_PREFIX;
14
15pub fn generate(module: &ModuleDef, lang: &dyn Lang) -> Vec<(String, String)> {
16 itertools::chain!(
17 module
18 .tables()
19 .map(|tbl| (lang.table_filename(module, tbl), lang.generate_table(module, tbl))),
20 module
21 .types()
22 .map(|typ| (lang.type_filename(&typ.name), lang.generate_type(module, typ))),
23 util::iter_reducers(module).map(|reducer| {
24 (
25 lang.reducer_filename(&reducer.name),
26 lang.generate_reducer(module, reducer),
27 )
28 }),
29 lang.generate_globals(module),
30 )
31 .collect()
32}
33
34pub trait Lang {
35 fn table_filename(&self, module: &ModuleDef, table: &TableDef) -> String;
36 fn type_filename(&self, type_name: &ScopedTypeName) -> String;
37 fn reducer_filename(&self, reducer_name: &Identifier) -> String;
38
39 fn generate_table(&self, module: &ModuleDef, tbl: &TableDef) -> String;
40 fn generate_type(&self, module: &ModuleDef, typ: &TypeDef) -> String;
41 fn generate_reducer(&self, module: &ModuleDef, reducer: &ReducerDef) -> String;
42 fn generate_globals(&self, module: &ModuleDef) -> Vec<(String, String)>;
43}