{"id":19847758,"url":"https://github.com/kkharji/process-stream","last_synced_at":"2025-05-01T22:30:22.593Z","repository":{"id":40377994,"uuid":"494874554","full_name":"kkharji/process-stream","owner":"kkharji","description":"Thin wrapper around [`tokio::process`] to make it streamable","archived":false,"fork":false,"pushed_at":"2023-11-15T09:04:29.000Z","size":52,"stargazers_count":10,"open_issues_count":1,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-25T18:13:52.955Z","etag":null,"topics":["async","process","stdout-stream","stream","tokio"],"latest_commit_sha":null,"homepage":"https://docs.rs/process-stream/0.3.0","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kkharji.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2022-05-21T19:17:15.000Z","updated_at":"2024-10-17T21:47:43.000Z","dependencies_parsed_at":"2023-11-15T10:25:38.795Z","dependency_job_id":"dd48bfab-998e-440b-8e1d-592a22775b5b","html_url":"https://github.com/kkharji/process-stream","commit_stats":null,"previous_names":["tami5/process-stream"],"tags_count":17,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kkharji%2Fprocess-stream","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kkharji%2Fprocess-stream/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kkharji%2Fprocess-stream/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kkharji%2Fprocess-stream/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kkharji","download_url":"https://codeload.github.com/kkharji/process-stream/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251954635,"owners_count":21670844,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["async","process","stdout-stream","stream","tokio"],"created_at":"2024-11-12T13:15:04.419Z","updated_at":"2025-05-01T22:30:22.274Z","avatar_url":"https://github.com/kkharji.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# process-stream\n\nWraps `tokio::process::Command` to `future::stream`.\n\nThis library provide ProcessExt to create your own custom process\n\n## Install\n\n```toml\nprocess-stream = \"0.3.1\"\n```\n\n## Example usage:\n\n### From `Vec\u003cString\u003e` or `Vec\u003c\u0026str\u003e`\n\n```rust\nuse process_stream::{Process, ProcessExt, StreamExt};\nuse std::io;\n\n#[tokio::main]\nasync fn main() -\u003e io::Result\u003c()\u003e {\n    let ls_home: Process = vec![\"/bin/ls\", \".\"].into();\n\n    let mut stream = ls_home.spawn_and_stream()?;\n\n    while let Some(output) = stream.next().await {\n        println!(\"{output}\")\n    }\n\n    Ok(())\n}\n```\n\n### From `Path/PathBuf/str`\n\n```rust\nuse process_stream::{Process, ProcessExt, StreamExt};\nuse std::io;\n\n#[tokio::main]\nasync fn main() -\u003e io::Result\u003c()\u003e {\n    let mut process: Process = \"/bin/ls\".into();\n\n    // block until process completes\n    let outputs = process.spawn_and_stream()?.collect::\u003cVec\u003c_\u003e\u003e().await;\n\n    println!(\"{outputs:#?}\");\n\n    Ok(())\n}\n```\n\n### New\n\n```rust\nuse process_stream::{Process, ProcessExt, StreamExt};\nuse std::io;\n\n#[tokio::main]\nasync fn main() -\u003e io::Result\u003c()\u003e {\n    let mut ls_home = Process::new(\"/bin/ls\");\n    ls_home.arg(\"~/\");\n\n    let mut stream = ls_home.spawn_and_stream()?;\n\n    while let Some(output) = stream.next().await {\n        println!(\"{output}\")\n    }\n\n    Ok(())\n}\n```\n\n### Kill\n\n```rust\nuse process_stream::{Process, ProcessExt, StreamExt};\nuse std::io;\n\n#[tokio::main]\nasync fn main() -\u003e io::Result\u003c()\u003e {\n    let mut long_process = Process::new(\"/bin/app\");\n\n    let mut stream = long_process.spawn_and_stream()?;\n\n    tokio::spawn(async move {\n      while let Some(output) = stream.next().await {\n        println!(\"{output}\")\n      }\n    })\n\n    // process some outputs\n    tokio::time::sleep(std::time::Duration::new(10, 0)).await;\n\n    // close the process\n    long_process.kill().await;\n\n    Ok(())\n}\n```\n\n### Communicate with running process\n```rust\nuse process_stream::{Process, ProcessExt, StreamExt};\n\n#[tokio::main]\nasync fn main() -\u003e io::Result\u003c()\u003e {\n    let mut process: Process = Process::new(\"sort\");\n\n    // Set stdin (by default is set to null)\n    process.stdin(Stdio::piped());\n\n    // Get Stream;\n    let mut stream = process.spawn_and_stream().unwrap();\n\n    // Get writer from stdin;\n    let mut writer = process.take_stdin().unwrap();\n\n    // Spawn new async task and move stream to it\n    let reader_thread = tokio::spawn(async move {\n        while let Some(output) = stream.next().await {\n            if output.is_exit() {\n                println!(\"DONE\")\n            } else {\n                println!(\"{output}\")\n            }\n        }\n    });\n\n    // Spawn new async task and move writer to it\n    let writer_thread = tokio::spawn(async move {\n        writer.write(b\"b\\nc\\na\\n\").await.unwrap();\n        writer.write(b\"f\\ne\\nd\\n\").await.unwrap();\n    });\n\n    // Wait till all threads finish\n    writer_thread.await.unwrap();\n    reader_thread.await.unwrap();\n\n    // Result\n    // a\n    // b\n    // c\n    // d\n    // e\n    // f\n    // DONE\n    Ok(())\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkkharji%2Fprocess-stream","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkkharji%2Fprocess-stream","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkkharji%2Fprocess-stream/lists"}