use core::fmt; use std::collections::HashMap; use std::fs::create_dir; use std::sync::{Arc, Mutex}; use log::{trace, debug, info, warn, error}; use uuid::Uuid; use std::fs::File; use colored::Colorize; use std::path::Path; use crate::error::{MizeError, MizeResult, IntoMizeResult, MizeResultTrait}; use crate::instance::store::Store; use crate::instance::connection::Connection; use crate::id::MizeId; use crate::instance::subscription::Subscription; use crate::item::{Item, ItemData}; use crate::memstore::MemStore; pub mod connection; pub mod store; pub mod subscription; static MSG_CHANNEL_SIZE: usize = 200; /// The Instance type is the heart of the mize system #[derive(Clone)] pub struct Instance { // question vec of stores??? // would mean replication logic and such things is handeled by the instance // i think it would be better thogh to then implement a ReplicatedStore pub store: S, peers: Arc>>>, subs: Arc>>, } /* pub enum RealmId { Uuid(Uuid), Local(Vec), Tld(Vec), } */ impl Instance { pub fn new() -> MizeResult> { trace!("[ {} ] Instance::new()", "CALL".yellow()); let memstore = MemStore::new(); let instance = Instance {store: memstore, peers: Arc::new(Mutex::new(Vec::new())), subs: Arc::new(Mutex::new(HashMap::new())) }; // platform specific init code if cfg!(feature = "os-target") { // on os platforms crate::platform::os::os_instance_init(instance.clone())? } // end of platform specific init code return Ok(instance); } } impl Instance { pub fn new_item(self) -> MizeResult> { let id = self.store.new_id()?; return Ok(Item {id, instance: self}); } pub fn get>(self, id: I) -> MizeResult> { return Ok(Item {id: id.into(), instance: self}); } pub fn set, V: Into>(self, id: I, value: V) -> MizeResult<()> { self.store.set(&id.into(), value) } } impl fmt::Debug for Instance { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "Mize Instance with subs: {:?}", self.subs,) } }