Add clap parser to main command
This commit is contained in:
parent
556599609a
commit
eedf62e304
31
src/main.rs
31
src/main.rs
@ -2,7 +2,8 @@ use std::{collections::HashMap, convert::Infallible, sync::Arc, time::{SystemTim
|
|||||||
|
|
||||||
use bluer::{self, Adapter, AdapterEvent, Address, DiscoveryFilter, DiscoveryTransport};
|
use bluer::{self, Adapter, AdapterEvent, Address, DiscoveryFilter, DiscoveryTransport};
|
||||||
|
|
||||||
use anyhow::Result;
|
use anyhow::{Result, anyhow};
|
||||||
|
use clap::Parser;
|
||||||
use futures::{Stream, StreamExt};
|
use futures::{Stream, StreamExt};
|
||||||
use tokio;
|
use tokio;
|
||||||
use warp::Filter;
|
use warp::Filter;
|
||||||
@ -70,15 +71,34 @@ impl DataStore {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug,clap::Parser)]
|
||||||
|
struct CLI {
|
||||||
|
/// Address to bind
|
||||||
|
#[arg(short, long, default_value = "127.0.0.1:9174")]
|
||||||
|
bind: String,
|
||||||
|
|
||||||
|
/// BLE HCI adapter to use
|
||||||
|
#[arg(short, long)]
|
||||||
|
interface: Option<String>,
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::main(flavor="current_thread")]
|
#[tokio::main(flavor="current_thread")]
|
||||||
async fn main() -> Result<()> {
|
async fn main() -> Result<()> {
|
||||||
|
|
||||||
|
let args = CLI::parse();
|
||||||
|
|
||||||
let session = bluer::Session::new().await?;
|
let session = bluer::Session::new().await?;
|
||||||
let adapter = Arc::new(session.default_adapter().await?);
|
let adapter = match &args.interface {
|
||||||
|
Some(hci) => session.adapter(&*hci),
|
||||||
|
None => session.default_adapter().await,
|
||||||
|
}?;
|
||||||
|
|
||||||
|
let adapter = Arc::new(adapter);
|
||||||
let store = Arc::new(Mutex::new(DataStore::default()));
|
let store = Arc::new(Mutex::new(DataStore::default()));
|
||||||
|
|
||||||
let mut stream = Box::pin(sensor_reports(adapter).await?);
|
let mut stream = Box::pin(sensor_reports(adapter).await?);
|
||||||
|
|
||||||
let sniffer_store = Arc::clone(&store);
|
let sniffer_store = Arc::clone(&store);
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
while let Some(data) = stream.next().await {
|
while let Some(data) = stream.next().await {
|
||||||
@ -93,7 +113,10 @@ async fn main() -> Result<()> {
|
|||||||
.and_then(|store: Arc<Mutex<DataStore>>| async move { Ok::<_,Infallible>(store.lock().await.scrape()) })
|
.and_then(|store: Arc<Mutex<DataStore>>| async move { Ok::<_,Infallible>(store.lock().await.scrape()) })
|
||||||
.or(warp::path!().map(|| { warp::reply::html("<h1>Sensirion BLE exporter</h1>") }));
|
.or(warp::path!().map(|| { warp::reply::html("<h1>Sensirion BLE exporter</h1>") }));
|
||||||
|
|
||||||
Ok(warp::serve(filter).run(([127,0,0,1],9177)).await)
|
let host = tokio::net::lookup_host(&args.bind).await?
|
||||||
|
.next()
|
||||||
|
.ok_or(anyhow!("Cannot resolve host to bind {}", &args.bind))?;
|
||||||
|
Ok(warp::serve(filter).run(host).await)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user