use crate::admin_data::{AdminActionSource, AdminDataSource, AdminQuerySource};
use crate::binding::ModuleBinding;
use crate::linked::{LinkedBinding, LinkedHttpContribution};
use crate::source::ModuleSource;
use lenso_contracts::ModuleManifest;
use platform_core::{RuntimeConfigDescriptor, RuntimeConfigGroupDescriptor};
use std::sync::Arc;
#[derive(Debug)]
pub struct Module {
pub manifest: ModuleManifest,
pub binding: Arc<dyn ModuleBinding>,
pub source: ModuleSource,
pub load_status: ModuleLoadStatus,
pub linked_http: Option<LinkedHttpContribution>,
pub runtime_config: &'static [RuntimeConfigDescriptor],
pub runtime_config_groups: &'static [RuntimeConfigGroupDescriptor],
pub admin_data: Option<Arc<dyn AdminDataSource>>,
pub admin_actions: Option<Arc<dyn AdminActionSource>>,
pub admin_queries: Option<Arc<dyn AdminQuerySource>>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ModuleLoadStatus {
Loaded,
Error { message: String },
}
impl Module {
#[must_use]
pub fn linked(manifest: ModuleManifest, binding: LinkedBinding) -> Self {
let linked_http = binding.http;
Self {
manifest,
binding: Arc::new(binding),
source: ModuleSource::Linked,
load_status: ModuleLoadStatus::Loaded,
linked_http,
runtime_config: &[],
runtime_config_groups: &[],
admin_data: None,
admin_actions: None,
admin_queries: None,
}
}
#[must_use]
pub fn service(manifest: ModuleManifest, binding: Arc<dyn ModuleBinding>) -> Self {
Self {
manifest,
binding,
source: ModuleSource::Service,
load_status: ModuleLoadStatus::Loaded,
linked_http: None,
runtime_config: &[],
runtime_config_groups: &[],
admin_data: None,
admin_actions: None,
admin_queries: None,
}
}
#[must_use]
pub fn with_runtime_config(
mut self,
runtime_config: &'static [RuntimeConfigDescriptor],
) -> Self {
self.runtime_config = runtime_config;
self
}
#[must_use]
pub fn with_runtime_config_groups(
mut self,
runtime_config_groups: &'static [RuntimeConfigGroupDescriptor],
) -> Self {
self.runtime_config_groups = runtime_config_groups;
self
}
#[must_use]
pub fn with_admin_data(mut self, data: Arc<dyn AdminDataSource>) -> Self {
self.admin_data = Some(data);
self
}
#[must_use]
pub fn with_admin_actions(mut self, actions: Arc<dyn AdminActionSource>) -> Self {
self.admin_actions = Some(actions);
self
}
#[must_use]
pub fn with_admin_queries(mut self, queries: Arc<dyn AdminQuerySource>) -> Self {
self.admin_queries = Some(queries);
self
}
}