function protoViz(root) {
const collector = [];
const drawArrows = (parent) => {
const branches = [
...Object.values(parent.nested || {}),
...Object.values(parent.fields || {}),
...Object.values(parent.values || {}),
...Object.values(parent.oneofs || {}),
...Object.values(parent.methods || {}),
...(parent.type ? [{ name: parent.type }] : []),
...(parent.requestType ? [{ name: parent.requestType }] : []),
...(parent.responseType ? [{ name: parent.responseType }] : []),
...(parent.oneof || []).map((name) => ({
name
}))
];
for (const child of branches) {
if (parent.name) {
collector.push(`${parent.name} -> ${child.name}`);
}
drawArrows(child);
}
};
drawArrows(root);
return dot`digraph {
rankdir=LR;
${collector.join(";\n")}
}`;
}