1use crate::api_model::{
2 ApiModel, BitmaskModel, CallbackFunctionModel, CallbackInfoModel, CallbackModel, ConstantModel,
3 EnumModel, FunctionModel, FunctionPointerModel, 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_function_pointer(&mut self, _f: &FunctionPointerModel) {}
14 fn visit_callback(&mut self, _c: &CallbackModel) {}
15 fn visit_callback_function(&mut self, _c: &CallbackFunctionModel) {}
16 fn visit_callback_info(&mut self, _c: &CallbackInfoModel) {}
17 fn visit_constant(&mut self, _c: &ConstantModel) {}
18 fn end(&mut self, _model: &ApiModel) {}
19}
20
21pub fn walk_model<V: ApiVisitor>(visitor: &mut V, model: &ApiModel) {
22 visitor.begin(model);
23
24 for e in &model.enums {
25 visitor.visit_enum(e);
26 }
27 for b in &model.bitmasks {
28 visitor.visit_bitmask(b);
29 }
30 for s in &model.structures {
31 visitor.visit_struct(s);
32 }
33 for f in &model.function_pointers {
34 visitor.visit_function_pointer(f);
35 }
36 for c in &model.callback_functions {
37 visitor.visit_callback_function(c);
38 }
39 for c in &model.callback_infos {
40 visitor.visit_callback_info(c);
41 }
42 for o in &model.objects {
43 visitor.visit_object(o);
44 }
45 for f in &model.functions {
46 visitor.visit_function(f);
47 }
48 for c in &model.callbacks {
49 visitor.visit_callback(c);
50 }
51 for c in &model.constants {
52 visitor.visit_constant(c);
53 }
54
55 visitor.end(model);
56}