Fall back to showing GraphViz source when GraphViz is not installed

This commit is contained in:
Lucien Greathouse
2019-01-29 18:10:14 -08:00
parent 8757834e07
commit 6719be02c3
6 changed files with 37 additions and 14 deletions

View File

@@ -20,9 +20,14 @@ fn make_path_absolute(value: &Path) -> PathBuf {
}
fn main() {
env_logger::Builder::from_default_env()
.default_format_timestamp(false)
.init();
{
let log_env = env_logger::Env::default()
.default_filter_or("warn");
env_logger::Builder::from_env(log_env)
.default_format_timestamp(false)
.init();
}
let app = clap_app!(Rojo =>
(version: env!("CARGO_PKG_VERSION"))

View File

@@ -5,6 +5,7 @@ use std::{
process::{Command, Stdio},
};
use log::warn;
use rbx_tree::RbxId;
use crate::{
@@ -27,13 +28,21 @@ digraph RojoTree {
"#;
/// Compiles DOT source to SVG by invoking dot on the command line.
pub fn graphviz_to_svg(source: &str) -> String {
let mut child = Command::new("dot")
pub fn graphviz_to_svg(source: &str) -> Option<String> {
let command = Command::new("dot")
.arg("-Tsvg")
.stdin(Stdio::piped())
.stdout(Stdio::piped())
.spawn()
.expect("Failed to spawn GraphViz process -- make sure it's installed in order to use /api/visualize");
.spawn();
let mut child = match command {
Ok(child) => child,
Err(_) => {
warn!("Failed to spawn GraphViz process to visualize current state.");
warn!("If you want pretty graphs, install GraphViz and make sure 'dot' is on your PATH!");
return None;
},
};
{
let stdin = child.stdin.as_mut().expect("Failed to open stdin");
@@ -41,7 +50,7 @@ pub fn graphviz_to_svg(source: &str) -> String {
}
let output = child.wait_with_output().expect("Failed to read stdout");
String::from_utf8(output.stdout).expect("Failed to parse stdout as UTF-8")
Some(String::from_utf8(output.stdout).expect("Failed to parse stdout as UTF-8"))
}
/// A Display wrapper struct to visualize an RbxSession as SVG.

View File

@@ -238,13 +238,21 @@ impl Server {
fn handle_visualize_rbx(&self) -> Response {
let rbx_session = self.live_session.rbx_session.lock().unwrap();
let dot_source = format!("{}", VisualizeRbxSession(&rbx_session));
Response::svg(graphviz_to_svg(&dot_source))
match graphviz_to_svg(&dot_source) {
Some(svg) => Response::svg(svg),
None => Response::text(dot_source),
}
}
fn handle_visualize_imfs(&self) -> Response {
let imfs = self.live_session.imfs.lock().unwrap();
let dot_source = format!("{}", VisualizeImfs(&imfs));
Response::svg(graphviz_to_svg(&dot_source))
match graphviz_to_svg(&dot_source) {
Some(svg) => Response::svg(svg),
None => Response::text(dot_source),
}
}
fn handle_visualize_path_metadata(&self) -> Response {