/
convert.rs
45 lines (38 loc) 路 1.61 KB
/
convert.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
use crate::{builders, InternalDataModel, InternalDataModelRef};
use once_cell::sync::OnceCell;
use std::sync::Arc;
pub fn convert(schema: &psl::ValidatedSchema, db_name: String) -> InternalDataModelRef {
let datamodel = psl::lift(schema);
let relation_placeholders = builders::relation_placeholders(&datamodel);
let models = builders::model_builders(&datamodel, &relation_placeholders);
let relations = builders::relation_builders(&relation_placeholders);
let enums = builders::convert_enums(&datamodel);
let composite_types = builders::composite_type_builders(&datamodel);
let internal_data_model = Arc::new(InternalDataModel {
models: OnceCell::new(),
composite_types: OnceCell::new(),
relations: OnceCell::new(),
relation_fields: OnceCell::new(),
db_name,
enums: enums.into_iter().map(Arc::new).collect(),
});
let composite_types = builders::build_composites(composite_types, Arc::downgrade(&internal_data_model));
internal_data_model.composite_types.set(composite_types).unwrap();
let models = models
.into_iter()
.map(|mt| {
mt.build(
Arc::downgrade(&internal_data_model),
internal_data_model.composite_types.get().unwrap(),
)
})
.collect();
internal_data_model.models.set(models).unwrap();
let relations = relations
.into_iter()
.map(|rt| rt.build(Arc::downgrade(&internal_data_model)))
.collect();
internal_data_model.relations.set(relations).unwrap();
internal_data_model.finalize();
internal_data_model
}