rust_webvr_api/
vr_future_frame_data.rs

1use vr_frame_data::VRFrameData;
2
3#[cfg(not(feature = "ipc"))]
4use std::sync::mpsc::{channel, Sender, Receiver};
5
6#[cfg(feature = "ipc")]
7use ipc_channel::ipc::{channel as ipc_channel, IpcSender as Sender, IpcReceiver as Receiver};
8
9#[cfg(feature = "ipc")]
10fn channel<T>() -> (Sender<T>, Receiver<T>) where
11    T: for<'de> serde::de::Deserialize<'de> + serde::ser::Serialize,
12{
13    ipc_channel().expect("Failed to create IPC channel")
14}
15
16#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
17enum State<T, U> {
18    Resolved(T),
19    Blocked(U),
20}
21
22#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
23pub struct VRFutureFrameData(State<VRFrameData, Receiver<VRFrameData>>);
24
25#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
26pub struct VRResolveFrameData(State<(), Sender<VRFrameData>>);
27
28impl VRFutureFrameData {
29    pub fn resolved(data: VRFrameData) -> VRFutureFrameData {
30        VRFutureFrameData(State::Resolved(data))
31    }
32
33    pub fn blocked() -> (VRResolveFrameData, VRFutureFrameData) {
34        let (send, recv) = channel();
35        (
36            VRResolveFrameData(State::Blocked(send)),
37            VRFutureFrameData(State::Blocked(recv)),
38        )
39    }
40
41    pub fn block(self) -> VRFrameData {
42        match self {
43            VRFutureFrameData(State::Resolved(result)) => result,
44            VRFutureFrameData(State::Blocked(recv)) => recv.recv().expect("Failed to get frame data"),
45        }
46    }
47}
48
49impl VRResolveFrameData {
50    pub fn resolve(&mut self, data: VRFrameData) -> Result<(), ()> {
51        match *self {
52            VRResolveFrameData(State::Resolved(())) => return Err(()),
53            VRResolveFrameData(State::Blocked(ref send)) => send.send(data).expect("Failed to put frame data"),
54        };
55        self.0 = State::Resolved(());
56        Ok(())
57    }
58}