Create dataflow html file in current directorytags/v0.0.0-test-pr-120
| @@ -1,10 +1,60 @@ | |||
| use std::{fs, path::Path}; | |||
| use std::{ | |||
| fs::{self, File}, | |||
| io::Write, | |||
| path::Path, | |||
| }; | |||
| use dora_core::descriptor::Descriptor; | |||
| use eyre::Context; | |||
| const MERMAID_TEMPLATE: &str = include_str!("mermaid-template.html"); | |||
| pub(crate) fn create(dataflow: std::path::PathBuf, mermaid: bool, open: bool) -> eyre::Result<()> { | |||
| if mermaid { | |||
| let visualized = visualize_as_mermaid(&dataflow)?; | |||
| println!("{visualized}"); | |||
| println!( | |||
| "Paste the above output on https://mermaid.live/ or in a \ | |||
| ```mermaid code block on GitHub to display it." | |||
| ); | |||
| } else { | |||
| let html = visualize_as_html(&dataflow)?; | |||
| let working_dir = std::env::current_dir().wrap_err("failed to get current working dir")?; | |||
| let graph_filename = match dataflow.file_stem().and_then(|n| n.to_str()) { | |||
| Some(name) => format!("{name}-graph"), | |||
| None => "graph".into(), | |||
| }; | |||
| let mut extra = 0; | |||
| let path = loop { | |||
| let adjusted_file_name = if extra == 0 { | |||
| format!("{graph_filename}.html") | |||
| } else { | |||
| format!("{graph_filename}.{extra}.html") | |||
| }; | |||
| let path = working_dir.join(&adjusted_file_name); | |||
| if path.exists() { | |||
| extra += 1; | |||
| } else { | |||
| break path; | |||
| } | |||
| }; | |||
| let mut file = File::create(&path).context("failed to create graph HTML file")?; | |||
| file.write_all(html.as_bytes())?; | |||
| println!( | |||
| "View graph by opening the following in your browser:\n file://{}", | |||
| path.display() | |||
| ); | |||
| if open { | |||
| webbrowser::open(path.as_os_str().to_str().unwrap())?; | |||
| } | |||
| } | |||
| Ok(()) | |||
| } | |||
| pub fn visualize_as_html(dataflow: &Path) -> eyre::Result<String> { | |||
| let mermaid = visualize_as_mermaid(dataflow)?; | |||
| Ok(MERMAID_TEMPLATE.replacen("____insert____", &mermaid, 1)) | |||
| @@ -4,8 +4,7 @@ use dora_core::topics::{ | |||
| ZENOH_CONTROL_START, ZENOH_CONTROL_STOP, | |||
| }; | |||
| use eyre::{bail, eyre, Context}; | |||
| use std::{io::Write, ops::Deref, path::PathBuf, sync::Arc}; | |||
| use tempfile::NamedTempFile; | |||
| use std::{ops::Deref, path::PathBuf, sync::Arc}; | |||
| use zenoh::{ | |||
| prelude::{Receiver, Selector, SplitBuffer}, | |||
| sync::ZFuture, | |||
| @@ -99,30 +98,7 @@ fn main() -> eyre::Result<()> { | |||
| mermaid, | |||
| open, | |||
| } => { | |||
| if mermaid { | |||
| let visualized = graph::visualize_as_mermaid(&dataflow)?; | |||
| println!("{visualized}"); | |||
| println!( | |||
| "Paste the above output on https://mermaid.live/ or in a \ | |||
| ```mermaid code block on GitHub to display it." | |||
| ); | |||
| } else { | |||
| let html = graph::visualize_as_html(&dataflow)?; | |||
| let mut file = NamedTempFile::new().context("failed to create temp file")?; | |||
| file.as_file_mut().write_all(html.as_bytes())?; | |||
| let path = file.path().to_owned(); | |||
| file.keep()?; | |||
| println!( | |||
| "View graph by opening the following in your browser:\n file://{}", | |||
| path.display() | |||
| ); | |||
| if open { | |||
| webbrowser::open(path.as_os_str().to_str().unwrap())?; | |||
| } | |||
| } | |||
| graph::create(dataflow, mermaid, open)?; | |||
| } | |||
| Command::Build { dataflow } => { | |||
| build::build(&dataflow)?; | |||