Skip to main content

dawn_codegen/
visitor.rs

1use crate::api_model::{
2    ApiModel, BitmaskModel, CallbackFunctionModel, CallbackInfoModel, CallbackModel, ConstantModel,
3    EnumModel, FunctionModel, ObjectModel, StructureModel,
4};
5
6pub trait ApiVisitor {
7    fn begin(&mut self, _model: &ApiModel) {}
8    fn visit_enum(&mut self, _e: &EnumModel) {}
9    fn visit_bitmask(&mut self, _b: &BitmaskModel) {}
10    fn visit_struct(&mut self, _s: &StructureModel) {}
11    fn visit_object(&mut self, _o: &ObjectModel) {}
12    fn visit_function(&mut self, _f: &FunctionModel) {}
13    fn visit_callback(&mut self, _c: &CallbackModel) {}
14    fn visit_callback_function(&mut self, _c: &CallbackFunctionModel) {}
15    fn visit_callback_info(&mut self, _c: &CallbackInfoModel) {}
16    fn visit_constant(&mut self, _c: &ConstantModel) {}
17    fn end(&mut self, _model: &ApiModel) {}
18}
19
20pub fn walk_model<V: ApiVisitor>(visitor: &mut V, model: &ApiModel) {
21    visitor.begin(model);
22
23    for e in &model.enums {
24        visitor.visit_enum(e);
25    }
26    for b in &model.bitmasks {
27        visitor.visit_bitmask(b);
28    }
29    for s in &model.structures {
30        visitor.visit_struct(s);
31    }
32    for c in &model.callback_functions {
33        visitor.visit_callback_function(c);
34    }
35    for c in &model.callback_infos {
36        visitor.visit_callback_info(c);
37    }
38    for o in &model.objects {
39        visitor.visit_object(o);
40    }
41    for f in &model.functions {
42        visitor.visit_function(f);
43    }
44    for c in &model.callbacks {
45        visitor.visit_callback(c);
46    }
47    for c in &model.constants {
48        visitor.visit_constant(c);
49    }
50
51    visitor.end(model);
52}