aboutsummaryrefslogtreecommitdiff
path: root/server/tools/src/diagram_dot.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/tools/src/diagram_dot.rs')
-rw-r--r--server/tools/src/diagram_dot.rs31
1 files changed, 27 insertions, 4 deletions
diff --git a/server/tools/src/diagram_dot.rs b/server/tools/src/diagram_dot.rs
index 2c953987..b3e54881 100644
--- a/server/tools/src/diagram_dot.rs
+++ b/server/tools/src/diagram_dot.rs
@@ -16,19 +16,42 @@
*/
-use anyhow::Result;
+use anyhow::{Result, bail};
use hurrycurry_protocol::{
Gamedata, Message,
book::{Diagram, NodeStyle},
};
-use std::fmt::Write;
+use std::{
+ fmt::Write,
+ io::Write as W2,
+ process::{Command, Stdio},
+};
+
+pub fn diagram_dot_svg(data: &Gamedata, diagram: &Diagram) -> Result<String> {
+ let mut child = Command::new("dot")
+ .arg("-Tsvg")
+ .arg("-Knop2")
+ .stdin(Stdio::piped())
+ .stdout(Stdio::piped())
+ .spawn()?;
-pub fn diagram_dot(data: &Gamedata, diagram: &Diagram) -> Result<String> {
+ let dot = diagram_dot(data, diagram, true)?;
+ child.stdin.as_mut().unwrap().write_all(dot.as_bytes())?;
+ let output = child.wait_with_output()?;
+ if !output.status.success() {
+ bail!("dot failed");
+ }
+ Ok(String::from_utf8(output.stdout)?)
+}
+
+pub fn diagram_dot(data: &Gamedata, diagram: &Diagram, use_position: bool) -> Result<String> {
let mut out = String::new();
writeln!(out, "digraph {{")?;
for (i, n) in diagram.nodes.iter().enumerate() {
let mut attrs = Vec::new();
-
+ if use_position {
+ attrs.push(format!("pos=\"{},{}!\"", n.position.x, n.position.y));
+ }
node_style(&mut attrs, &n.style);
match &n.label {
Message::Text(text) => {