Skip to main content

dawn_codegen/
visitor.rs

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}