use std::sync::Arc;
use serde::Deserialize;
use trusty_common::uds::server::RpcRouter;
use crate::daemon::api::PairConfirmRequest;
use crate::daemon::api::types::{PairConfirmResponse, PairResetResponse};
use crate::daemon::services::{PairCode, PairStatus, PairingService};
use crate::daemon::state::DaemonState;
use super::NoParams;
pub fn request_op(state: &Arc<DaemonState>) -> PairCode {
PairingService::new(state).request_code()
}
pub fn confirm_op(state: &Arc<DaemonState>, req: &PairConfirmRequest) -> PairConfirmResponse {
match PairingService::new(state).confirm(&req.code, req.chat_id) {
Ok(()) => PairConfirmResponse {
success: true,
chat_id: Some(req.chat_id),
error: None,
},
Err(_) => PairConfirmResponse {
success: false,
chat_id: None,
error: Some("invalid or expired code".to_string()),
},
}
}
pub fn status_op(state: &Arc<DaemonState>) -> PairStatus {
PairingService::new(state).status()
}
pub fn reset_op(state: &Arc<DaemonState>) -> PairResetResponse {
PairingService::new(state).reset();
PairResetResponse { reset: true }
}
#[derive(Debug, Deserialize)]
pub struct ConfirmParams {
pub code: String,
pub chat_id: i64,
}
pub fn register(router: RpcRouter, state: &Arc<DaemonState>) -> RpcRouter {
let held = Arc::clone(state);
let r = router.typed::<NoParams, PairCode, _, _>("mpm.pair.request", move |_| {
let s = Arc::clone(&held);
async move { Ok(request_op(&s)) }
});
let held = Arc::clone(state);
let r = r.typed::<ConfirmParams, PairConfirmResponse, _, _>("mpm.pair.confirm", move |p| {
let s = Arc::clone(&held);
async move {
Ok(confirm_op(
&s,
&PairConfirmRequest {
code: p.code,
chat_id: p.chat_id,
},
))
}
});
let held = Arc::clone(state);
let r = r.typed::<NoParams, PairStatus, _, _>("mpm.pair.status", move |_| {
let s = Arc::clone(&held);
async move { Ok(status_op(&s)) }
});
let held = Arc::clone(state);
r.typed::<NoParams, PairResetResponse, _, _>("mpm.pair.reset", move |_| {
let s = Arc::clone(&held);
async move { Ok(reset_op(&s)) }
})
}