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}