diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 928b81f6..296b9027 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -118,6 +118,9 @@ jobs: - name: "Rust Dataflow example" timeout-minutes: 30 run: cargo run --example rust-dataflow + - name: "Rust Git Dataflow example" + timeout-minutes: 30 + run: cargo run --example rust-dataflow-git - name: "Multiple Daemons example" timeout-minutes: 30 run: cargo run --example multiple-daemons diff --git a/Cargo.toml b/Cargo.toml index f67b0fcb..a353bf17 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -132,6 +132,10 @@ path = "examples/vlm/run.rs" name = "rust-dataflow" path = "examples/rust-dataflow/run.rs" +[[example]] +name = "rust-dataflow-git" +path = "examples/rust-dataflow-git/run.rs" + [[example]] name = "rust-ros2-dataflow" path = "examples/rust-ros2-dataflow/run.rs" diff --git a/examples/rust-dataflow-git/README.md b/examples/rust-dataflow-git/README.md new file mode 100644 index 00000000..f4d2f3de --- /dev/null +++ b/examples/rust-dataflow-git/README.md @@ -0,0 +1,7 @@ +# Git-based Rust example + +To get started: + +```bash +cargo run --example rust-dataflow-git +``` diff --git a/examples/rust-dataflow-git/dataflow.yml b/examples/rust-dataflow-git/dataflow.yml new file mode 100644 index 00000000..f4bca5df --- /dev/null +++ b/examples/rust-dataflow-git/dataflow.yml @@ -0,0 +1,29 @@ +nodes: + - id: rust-node + git: https://github.com/dora-rs/dora.git + rev: e31b2a34 # pinned commit, update this when changing the message crate + build: cargo build -p rust-dataflow-example-node + path: target/debug/rust-dataflow-example-node + inputs: + tick: dora/timer/millis/10 + outputs: + - random + + - id: rust-status-node + git: https://github.com/dora-rs/dora.git + rev: e31b2a34 # pinned commit, update this when changing the message crate + build: cargo build -p rust-dataflow-example-status-node + path: target/debug/rust-dataflow-example-status-node + inputs: + tick: dora/timer/millis/100 + random: rust-node/random + outputs: + - status + + - id: rust-sink + git: https://github.com/dora-rs/dora.git + rev: e31b2a34 # pinned commit, update this when changing the message crate + build: cargo build -p rust-dataflow-example-sink + path: target/debug/rust-dataflow-example-sink + inputs: + message: rust-status-node/status diff --git a/examples/rust-dataflow-git/run.rs b/examples/rust-dataflow-git/run.rs new file mode 100644 index 00000000..213b65a0 --- /dev/null +++ b/examples/rust-dataflow-git/run.rs @@ -0,0 +1,52 @@ +use dora_tracing::set_up_tracing; +use eyre::{bail, Context}; +use std::path::Path; + +#[tokio::main] +async fn main() -> eyre::Result<()> { + set_up_tracing("rust-dataflow-runner").wrap_err("failed to set up tracing subscriber")?; + + let root = Path::new(env!("CARGO_MANIFEST_DIR")); + std::env::set_current_dir(root.join(file!()).parent().unwrap()) + .wrap_err("failed to set working dir")?; + + let args: Vec = std::env::args().collect(); + let dataflow = if args.len() > 1 { + Path::new(&args[1]) + } else { + Path::new("dataflow.yml") + }; + + build_dataflow(dataflow).await?; + + run_dataflow(dataflow).await?; + + Ok(()) +} + +async fn build_dataflow(dataflow: &Path) -> eyre::Result<()> { + let cargo = std::env::var("CARGO").unwrap(); + let mut cmd = tokio::process::Command::new(&cargo); + cmd.arg("run"); + cmd.arg("--package").arg("dora-cli"); + cmd.arg("--").arg("build").arg(dataflow); + if !cmd.status().await?.success() { + bail!("failed to build dataflow"); + }; + Ok(()) +} + +async fn run_dataflow(dataflow: &Path) -> eyre::Result<()> { + let cargo = std::env::var("CARGO").unwrap(); + let mut cmd = tokio::process::Command::new(&cargo); + cmd.arg("run"); + cmd.arg("--package").arg("dora-cli"); + cmd.arg("--") + .arg("daemon") + .arg("--run-dataflow") + .arg(dataflow); + if !cmd.status().await?.success() { + bail!("failed to run dataflow"); + }; + Ok(()) +}