use arti_client::TorClient;
use derive_deftly::Deftly;
use std::sync::Arc;
use tor_rpcbase::{self as rpc};
use tor_rtcompat::Runtime;
#[derive(Deftly)]
#[derive_deftly(rpc::Object)]
pub(super) struct RpcSuperuser<R: Runtime> {
tor_client: TorClient<R>,
}
impl<R: Runtime> RpcSuperuser<R> {
pub(super) fn new(tor_client: TorClient<R>) -> Self {
RpcSuperuser { tor_client }
}
pub(super) fn rpc_methods() -> Vec<rpc::dispatch::InvokerEnt> {
rpc::invoker_ent_list![enter_dormant_mode_on_rpcsuperuser::<R>,]
}
}
#[derive(Debug, serde::Deserialize, serde::Serialize, Deftly)]
#[derive_deftly(rpc::DynMethod)]
#[deftly(rpc(method_name = "arti:enter_dormant_mode"))]
struct EnterDormantMode {}
impl rpc::RpcMethod for EnterDormantMode {
type Output = rpc::Nil;
type Update = rpc::NoUpdates;
}
async fn enter_dormant_mode_on_rpcsuperuser<R: Runtime>(
session: Arc<RpcSuperuser<R>>,
_method: Box<EnterDormantMode>,
_ctx: Arc<dyn rpc::Context>,
) -> Result<rpc::Nil, rpc::RpcError> {
use arti_client::DormantMode;
session.tor_client.set_dormant(DormantMode::Soft);
Ok(rpc::Nil::default())
}