2021-09-24 21:13:52 +03:00
|
|
|
module walker
|
|
|
|
|
|
|
|
import toml.ast
|
|
|
|
|
2021-09-25 20:31:02 +03:00
|
|
|
// Visitor defines a visit method which is invoked by the walker in each Value node it encounters.
|
2021-09-24 21:13:52 +03:00
|
|
|
pub interface Visitor {
|
2021-09-25 20:31:02 +03:00
|
|
|
visit(value &ast.Value) ?
|
2021-09-24 21:13:52 +03:00
|
|
|
}
|
|
|
|
|
2021-09-25 20:31:02 +03:00
|
|
|
pub type InspectorFn = fn (value &ast.Value, data voidptr) ?
|
2021-09-24 21:13:52 +03:00
|
|
|
|
|
|
|
struct Inspector {
|
|
|
|
inspector_callback InspectorFn
|
|
|
|
mut:
|
|
|
|
data voidptr
|
|
|
|
}
|
|
|
|
|
2021-09-25 20:31:02 +03:00
|
|
|
pub fn (i &Inspector) visit(value &ast.Value) ? {
|
|
|
|
i.inspector_callback(value, i.data) or { return err }
|
2021-09-24 21:13:52 +03:00
|
|
|
}
|
|
|
|
|
2021-09-25 20:31:02 +03:00
|
|
|
// inspect traverses and checks the AST Value node on a depth-first order and based on the data given
|
|
|
|
pub fn inspect(value &ast.Value, data voidptr, inspector_callback InspectorFn) ? {
|
|
|
|
walk(Inspector{inspector_callback, data}, value) ?
|
2021-09-24 21:13:52 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// walk traverses the AST using the given visitor
|
2021-09-25 20:31:02 +03:00
|
|
|
pub fn walk(visitor Visitor, value &ast.Value) ? {
|
|
|
|
if value is map[string]ast.Value {
|
|
|
|
value_map := value as map[string]ast.Value
|
|
|
|
for _, val in value_map {
|
|
|
|
walk(visitor, &val) ?
|
2021-09-24 21:13:52 +03:00
|
|
|
}
|
|
|
|
} else {
|
2021-09-25 20:31:02 +03:00
|
|
|
visitor.visit(value) ?
|
2021-09-24 21:13:52 +03:00
|
|
|
}
|
|
|
|
}
|