pub mod file;
pub mod members;
pub mod overview;
pub use file::FileModule;
pub use members::MembersModule;
pub use overview::OverviewModule;
use std::any::Any;
use std::collections::HashMap;
use std::fmt::Debug;
use std::rc::Rc;
use std::sync::{Arc, Mutex};
use crate::StudIpClient;
type ModuleConstructor = fn(Rc<CourseModuleData>) -> Box<dyn CourseModule>;
pub(crate) static COURSE_MODULE_REGISTRY: once_cell::sync::Lazy<Arc<Mutex<HashMap<&'static str, ModuleConstructor>>>> = once_cell::sync::Lazy::new(Default::default);
pub(crate) static REGISTERED_DEFAULT_COURSE_MODULES: once_cell::sync::OnceCell<()> = once_cell::sync::OnceCell::new();
pub trait CourseModule: Debug + Any {
fn new(data: Rc<CourseModuleData>) -> Self where Self: Sized;
fn name() -> &'static str where Self: Sized;
fn as_any(&mut self) -> &mut dyn Any;
}
pub fn register_course_module<M: CourseModule + 'static>() {
let mut registry = COURSE_MODULE_REGISTRY.lock().unwrap();
registry.insert(M::name(), |data| Box::new(M::new(data)));
}
#[derive(Debug)]
pub struct CourseModuleData {
pub course_id: String,
pub client: Rc<StudIpClient>,
}
pub (crate) fn register_default_course_modules() {
register_course_module::<FileModule>();
register_course_module::<MembersModule>();
register_course_module::<OverviewModule>();
}