gmt_dos-actors 12.1.0

Giant Magellan Telescope Dynamic Optical Simulation Actor Model
Documentation
use interface::TryUpdate;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use std::sync::Arc;
use tokio::{sync::Mutex, task};

pub fn serialize<S, C: TryUpdate + Serialize>(client: &Arc<Mutex<C>>, s: S) -> Result<S::Ok, S::Error>
where
    S: Serializer,
{
    task::block_in_place(move || client.blocking_lock().serialize(s))
}

pub fn deserialize<'de, D, C: TryUpdate + Deserialize<'de>>(
    deserializer: D,
) -> Result<Arc<Mutex<C>>, D::Error>
where
    D: Deserializer<'de>,
{
    Ok(Arc::new(Mutex::new(C::deserialize(deserializer)?)))
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::prelude::Actor;

    #[derive(Debug, Serialize, Deserialize)]
    pub struct Client();
    impl interface::Update for Client {}

    #[test]
    fn serde() {
        let actor: Actor<_> = Client().into();
        dbg!(&actor);
        let value = serde_pickle::to_value(&actor).unwrap();
        let actor: Actor<Client, 1, 1> = serde_pickle::from_value(value).unwrap();
        dbg!(&actor);
    }
}