use std::marker::PhantomData;
use std::sync::Arc;
use bytemuck::Pod;
use bytes::Bytes;
use crate::fleet::Fleet;
use crate::id::NetId64;
use crate::typed::OrbitTyped;
#[derive(Clone)]
pub struct Orbital<T: OrbitTyped + Pod> {
fleet: Arc<Fleet>,
_t: PhantomData<T>,
}
impl<T: OrbitTyped + Pod> Orbital<T> {
pub fn new(fleet: Arc<Fleet>) -> Self {
Self {
fleet,
_t: PhantomData,
}
}
pub fn store(&self, value: T) -> NetId64 {
let payload = Bytes::copy_from_slice(bytemuck::bytes_of(&value));
self.fleet.publish::<T>(0, 0, payload)
}
pub fn load(&self) -> Option<T> {
let frame = self.fleet.read_head::<T>()?;
bytemuck::try_from_bytes::<T>(&frame.payload).ok().copied()
}
pub fn load_by_id(&self, id: NetId64) -> Option<T> {
let frame = self.fleet.read(id)?;
bytemuck::try_from_bytes::<T>(&frame.payload).ok().copied()
}
pub fn fleet(&self) -> &Arc<Fleet> {
&self.fleet
}
}