use serde::{Deserialize, Serialize};
use serde_json::Value;
use tokio::sync::oneshot;
use crate::bus::BusRpcContext;
use super::domain::ConfigDomain;
use super::types::{ConfigError, SectionRegistration};
pub struct ConfigRequest {
pub payload: ConfigRequestPayload,
pub reply_to: oneshot::Sender<Result<ConfigResponse, ConfigError>>,
}
#[aves::bus_requests(marker = ConfigDomain, context = BusRpcContext, root_error = ConfigError, domain_error = ConfigError)]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ConfigRequestPayload {
#[privileged(reason = "Config section registration is internal setup authority, not public RPC")]
#[serde(skip)]
RegisterSection { registration: SectionRegistration },
#[privileged(reason = "Closing Config registration is internal runtime control, not public RPC")]
#[serde(skip)]
SealRegistration,
#[operation(name = "getConfigSection", kind = "query", response = ConfigSectionOutput, response_variant = "ConfigSection")]
GetConfigSection { section: String },
#[operation(name = "saveConfigSection", kind = "mutation", response = ConfigSectionSavedOutput, response_variant = "ConfigSectionSaved")]
SaveConfigSection { section: String, value: Value },
}
#[aves::bus_responses]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ConfigResponse {
ConfigSection {
value: Value,
},
ConfigSectionSaved {
section: String,
},
Registered,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ConfigBroadcast {
ConfigChanged {
section: String,
value: Value,
},
}