use std::{fmt::Display, sync::Arc};
use crate::serde::{de::DeserializeOwned, Serialize};
use crate::json::Value;
use crate::result::Result;
use super::resources::Resources;
#[derive(Clone)]
pub struct System {
state: Value,
resources: Resources,
}
impl std::fmt::Debug for System {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("System")
.field("state", &self.state)
.field("resources", &"Resources { ... }")
.finish()
}
}
impl Display for System {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.state.fmt(f)
}
}
impl System {
pub fn try_from<S>(state: S) -> Result<Self>
where
S: Serialize,
{
let state = serde_json::to_value(state)?;
Ok(Self {
state,
resources: Resources::new(),
})
}
pub fn inner_state(&self) -> &Value {
&self.state
}
pub fn inner_state_mut(&mut self) -> &mut Value {
&mut self.state
}
pub fn state<S>(&self) -> Result<S>
where
S: DeserializeOwned,
{
let s = serde_json::from_value(self.state.clone())?;
Ok(s)
}
pub fn set_resources(&mut self, resources: Resources) {
self.resources = resources;
}
pub fn resource<R>(&self) -> Option<Arc<R>>
where
R: Send + Sync + 'static,
{
self.resources.get::<R>()
}
}