DocumentWalker
Header: swaggercpp/walker.hpp
Deterministic visitor-pattern traversal of a Document. Implement only the callbacks you care about — defaults are no-ops.
API
cpp
class DocumentVisitor {
public:
virtual ~DocumentVisitor() = default;
virtual void enter_document(const Document&);
virtual void leave_document(const Document&);
virtual void enter_path_item(std::string_view path, const PathItem&);
virtual void leave_path_item(std::string_view path, const PathItem&);
virtual void enter_operation(std::string_view path, HttpMethod, const Operation&);
virtual void leave_operation(std::string_view path, HttpMethod, const Operation&);
virtual void visit_parameter(const Parameter&);
virtual void visit_response(std::string_view status, const Response&);
virtual void visit_schema(const Schema&, std::string_view jsonPointer);
};
class DocumentWalker {
public:
static void walk(const Document&, DocumentVisitor&);
};Traversal order
For a Document, walk invokes callbacks in this order:
enter_document- For each
paths[key], ordered alphabetically:enter_path_item(key, ...)- For each
operations[method]:enter_operation(key, method, ...)visit_parameterfor every parameter (path-level first, then operation-level)visit_responsefor each response code, ordered by status stringvisit_schemafor schemas discovered in parameters, request body, and responsesleave_operation
leave_path_item
leave_document
TIP
visit_schema is fired per distinct schema reference. Cyclic schemas (all_of loops) are visited once — the walker tracks visited nodes.
Example: counting methods
cpp
struct MethodCounter : swaggercpp::DocumentVisitor {
std::map<swaggercpp::HttpMethod, int> counts;
void enter_operation(std::string_view,
swaggercpp::HttpMethod method,
const swaggercpp::Operation&) override {
++counts[method];
}
};
MethodCounter visitor;
swaggercpp::DocumentWalker::walk(doc, visitor);
for (const auto& [m, n] : visitor.counts)
std::cout << swaggercpp::to_string(m) << " = " << n << '\n';Example: emitting Markdown table of contents
cpp
struct TocVisitor : swaggercpp::DocumentVisitor {
std::ostringstream out;
void enter_operation(std::string_view path,
swaggercpp::HttpMethod method,
const swaggercpp::Operation& op) override {
out << "- **" << swaggercpp::to_string(method) << "** `" << path << "` — "
<< op.summary.value_or(op.operation_id.value_or("(unnamed)")) << '\n';
}
};
TocVisitor v;
swaggercpp::DocumentWalker::walk(doc, v);
std::cout << v.out.str();See also
- Traverse example
- Endpoint catalog example — more elaborate traversal
- Document model