impl CrossLanguageDependencies {
pub fn to_dot(&self) -> String {
let mut dot = String::from("digraph CrossLanguageDependencies {\n");
for node in self.nodes.values() {
let shape = match node.kind {
NodeKind::Class => "box",
NodeKind::Interface | NodeKind::Trait => "ellipse",
NodeKind::Method | NodeKind::Function => "octagon",
_ => "plaintext",
};
let label = format!("{} ({})", node.name, node.language.name());
dot.push_str(&format!(
" \"{}\" [label=\"{}\" shape={} style=filled fillcolor={}];\n",
node.id,
label,
shape,
self.language_color(node.language)
));
}
for dep in &self.dependencies {
let style = match dep.kind {
ReferenceKind::Inherits => "bold",
ReferenceKind::Implements => "dashed",
_ => "solid",
};
let label = format!("{:?}", dep.kind);
dot.push_str(&format!(
" \"{}\" -> \"{}\" [label=\"{}\" style={}];\n",
dep.source_id, dep.target_id, label, style
));
}
dot.push_str("}\n");
dot
}
fn language_color(&self, language: Language) -> &'static str {
match language {
Language::Java => "\"#b07219\"", Language::Kotlin => "\"#A97BFF\"", Language::Scala => "\"#c22d40\"", Language::TypeScript => "\"#2b7489\"", Language::JavaScript => "\"#f1e05a\"", Language::Python => "\"#3572A5\"", Language::Rust => "\"#dea584\"", Language::Go => "\"#00ADD8\"", Language::Cpp => "\"#f34b7d\"", _ => "\"#bbbbbb\"", }
}
}