parallel_downloader 0.3.0

A robust, concurrent file downloader designed to be resilient, supporting automatic retries, crash recovery, and download verification.
Documentation
use anyhow::Result;
use parallel_downloader::config::Settings;
use parallel_downloader::ipc::{Command, Request, Response};
use tokio::io::{AsyncReadExt, AsyncWriteExt};
use tokio::net::TcpStream;

pub async fn send_command_raw(cmd: Command) -> Result<Response> {
    let settings = Settings::load().unwrap_or_default();
    let addr = settings
        .daemon_addr
        .unwrap_or_else(|| "127.0.0.1:9090".to_string());
    let secret = settings.daemon_secret;
    let mut stream = TcpStream::connect(addr)
        .await
        .map_err(|_| anyhow::anyhow!("Could not connect to daemon. Is it running?"))?;

    let req = Request {
        secret,
        command: cmd,
    };

    let json_req = serde_json::to_string(&req)?;
    stream.write_all(json_req.as_bytes()).await?;

    let mut buf = [0; 1024];
    let n = stream.read(&mut buf).await?;
    let json_resp = String::from_utf8_lossy(&buf[..n]);

    let response: Response = serde_json::from_str(&json_resp)?;

    Ok(response)
}