#![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-F4 OTA provider: announce + serve a .ota over BDX")]
struct Args {
#[arg(long)]
store: PathBuf,
#[arg(long)]
node: u64,
#[arg(long)]
version: u32,
#[arg(long)]
image: PathBuf,
#[arg(long, default_value_t = 5560)]
port: u16,
#[arg(long, default_value_t = 960)]
block_size: u16,
}
#[tokio::main]
async fn main() -> Result<()> {
let args = Args::parse();
let image = std::fs::read(&args.image).context("read .ota image")?;
println!(
"[ota] loaded {}-byte image; announcing to node {} + serving on port {} (block size {})…",
image.len(),
args.node,
args.port,
args.block_size
);
let store = Arc::new(FileStore::new(&args.store));
let controller = MatterController::open(store)
.await
.context("open controller")?;
controller
.serve_ota_with_block_size(args.node, image, args.version, args.port, args.block_size)
.await
.context("serve_ota")?;
println!("[ota] done — requestor downloaded + applied the image");
Ok(())
}