tail-fin-daemon 0.6.4

Long-running browser-session daemon for tail-fin (tfd binary). Keeps Chrome tabs warm across invocations via a Unix-socket protocol; registers Site implementations through a runtime Arc<dyn Site> registry.
Documentation
use clap::Subcommand;
use night_fury_daemon_core::cli::make_req;
use night_fury_daemon_core::{client, spawn};
use serde_json::json;

use super::{acquire_then_exec, ExecArgs};

#[derive(Subcommand)]
pub enum TwitterCmd {
    /// Home timeline
    Timeline {
        #[arg(long, default_value = "following")]
        r#type: String,
        #[arg(long, default_value_t = 20)]
        count: u64,
    },
    /// Search tweets
    Search {
        query: String,
        #[arg(long, default_value_t = 20)]
        count: u64,
    },
}

pub async fn run(
    cmd: TwitterCmd,
    socket: &str,
    host: &str,
    session: Option<String>,
) -> anyhow::Result<()> {
    let (cmd_name, params) = match cmd {
        TwitterCmd::Timeline { r#type, count } => {
            ("twitter.timeline", json!({"type": r#type, "count": count}))
        }
        TwitterCmd::Search { query, count } => {
            ("twitter.search", json!({"query": query, "count": count}))
        }
    };

    if let Some(sid) = session {
        spawn::ensure_daemon(socket).await?;
        let req = make_req(cmd_name, Some(&sid), params);
        let resp = client::send(socket, &req).await?;
        super::print_and_check(&resp);
        return Ok(());
    }

    let args = ExecArgs {
        site: "twitter",
        host,
        cmd: cmd_name,
        params,
    };
    acquire_then_exec(socket, args).await
}