use anyhow::Result;
use async_trait::async_trait;
use std::sync::Arc;
use crate::services::{KeysDelegate, LifecycleContext, RequestContext};
use crate::AbstractService;
use runar_common::logging::Logger;
use runar_macros_common::{log_debug, log_info};
use runar_serializer::ArcValue;
pub struct KeysService {
logger: Arc<Logger>,
keys_delegate: Arc<dyn KeysDelegate>,
}
impl KeysService {
pub fn new(logger: Arc<Logger>, delegate: Arc<dyn KeysDelegate>) -> Self {
KeysService {
logger,
keys_delegate: delegate,
}
}
async fn register_ensure_symmetric_key_action(&self, context: &LifecycleContext) -> Result<()> {
let self_clone = self.clone();
context
.register_action(
"ensure_symmetric_key",
Arc::new(move |params, ctx| {
let inner_self = self_clone.clone();
let key_name: String = params
.expect("key_name parameter is required")
.as_type_ref::<String>()
.expect("key_name parameter must be a string")
.as_ref()
.clone();
Box::pin(
async move { inner_self.handle_ensure_symmetric_key(key_name, ctx).await },
)
}),
)
.await?;
log_debug!(context.logger, "Registered ensure_symmetric_key action");
Ok(())
}
async fn handle_ensure_symmetric_key(
&self,
key_name: String,
ctx: RequestContext,
) -> Result<ArcValue> {
log_debug!(ctx.logger, "ensure_symmetric_key");
self.keys_delegate.ensure_symmetric_key(&key_name).await
}
}
#[async_trait]
impl AbstractService for KeysService {
fn name(&self) -> &str {
"runar keys"
}
fn path(&self) -> &str {
"$keys"
}
fn version(&self) -> &str {
"1.0.0"
}
fn description(&self) -> &str {
"Keys service for key management"
}
fn network_id(&self) -> Option<String> {
None
}
fn set_network_id(&mut self, _network_id: String) {}
async fn init(&self, context: LifecycleContext) -> Result<()> {
log_info!(context.logger, "Initializing keys Service");
log_debug!(context.logger, "Registering keys Service action handlers");
self.register_ensure_symmetric_key_action(&context).await?;
log_debug!(
context.logger,
"Registered handler for ensure_symmetric_key action"
);
log_info!(context.logger, "Keys Service initialization complete");
Ok(())
}
async fn start(&self, context: LifecycleContext) -> Result<()> {
log_info!(context.logger, "Starting keys Service");
Ok(())
}
async fn stop(&self, context: LifecycleContext) -> Result<()> {
log_info!(context.logger, "Stopping keys Service");
Ok(())
}
}
impl Clone for KeysService {
fn clone(&self) -> Self {
Self {
logger: self.logger.clone(),
keys_delegate: self.keys_delegate.clone(),
}
}
}