rust_webvr_api/
vr_future_frame_data.rs1use 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}