#![allow(clippy::too_many_lines, clippy::doc_markdown)]
use std::path::PathBuf;
use std::sync::Arc;
use anyhow::{Context, Result};
use clap::Parser;
use matter_controller::{FileStore, MatterController};
#[derive(Parser)]
#[command(about = "M9-F3 OTA provider server (advertise + accept one CASE session + dispatch)")]
struct Args {
#[arg(long)]
store: PathBuf,
#[arg(long, default_value_t = 5541)]
port: u16,
#[arg(long, default_value_t = 1)]
max_invokes: usize,
}
#[tokio::main]
async fn main() -> Result<()> {
let args = Args::parse();
let store = Arc::new(FileStore::new(&args.store));
let controller = MatterController::open(store)
.await
.context("open controller from store")?;
println!(
"[provider] advertising operational service on port {}; waiting for an inbound CASE session (max_invokes={})…",
args.port, args.max_invokes
);
let dispatched = controller
.serve_provider_once(
args.port,
|req: &matter_interaction::ParsedInvokeRequest| {
let path = req.commands[0].path;
println!(
"[provider] dispatching server-side invoke (ep {}, cluster {:#06x}, cmd {:#04x}) → SUCCESS",
path.endpoint, path.cluster, path.command
);
matter_interaction::build_invoke_response_status(
path,
matter_interaction::ImStatus::Success,
)
},
args.max_invokes,
)
.await
.context("serve provider once")?;
println!("[provider] done; dispatched {dispatched} invoke(s)");
Ok(())
}