use std::marker::PhantomData; use orchid_api::atom::Atom; use orchid_api::expr::ExprTicket; use orchid_api::proto::ExtMsgSet; use orchid_api::system::SysId; use orchid_base::reqnot::ReqNot; use crate::atom::{decode_atom, AtomCard, ForeignAtom}; use crate::system::SystemCard; pub struct SystemHandle { pub(crate) _card: PhantomData, pub(crate) id: SysId, pub(crate) reqnot: ReqNot, } impl SystemHandle { pub(crate) fn new(id: SysId, reqnot: ReqNot) -> Self { Self { _card: PhantomData, id, reqnot } } pub fn id(&self) -> SysId { self.id } pub fn wrap_atom>( &self, api: Atom, ticket: ExprTicket, ) -> Result, Atom> { if api.owner == self.id { if let Some(value) = decode_atom::(&T::default(), &api) { return Ok(ForeignAtom { ticket, sys: self.clone(), value, api }); } } Err(api) } } impl Clone for SystemHandle { fn clone(&self) -> Self { Self { reqnot: self.reqnot.clone(), _card: PhantomData, id: self.id } } }