pub struct AppContext {
config: crate::config::Config,
pub ui: std::sync::Arc<dyn crate::utils::ui::Ui>,
sources: std::sync::Mutex<Option<crate::sources::Sources>>,
model_proxy: Option<crate::proxy::ProxyHandle>,
}
impl AppContext {
pub(crate) fn new(
config: crate::config::Config,
ui: std::sync::Arc<dyn crate::utils::ui::Ui>,
) -> Self {
Self {
config,
ui,
sources: std::sync::Mutex::new(None),
model_proxy: None,
}
}
pub(crate) fn config(&self) -> &crate::config::Config {
&self.config
}
pub(crate) fn config_mut(&mut self) -> &mut crate::config::Config {
self.invalidate();
&mut self.config
}
pub(crate) fn set_config(&mut self, config: crate::config::Config) {
self.invalidate();
self.config = config;
}
pub(crate) fn set_model_proxy(&mut self, model_proxy: crate::proxy::ProxyHandle) {
self.invalidate();
self.model_proxy = Some(model_proxy);
}
pub(crate) fn sources(&self) -> crate::sources::Sources {
let mut held = self.sources.lock().unwrap();
held.get_or_insert_with(|| {
crate::sources::Sources::build(&self.config, self.model_proxy.clone())
})
.clone()
}
fn invalidate(&mut self) {
*self.sources.lock().unwrap() = None;
}
}