/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use serde::{Deserialize, Deserializer, Serialize, Serializer}; macro_rules! unreachable_serializable { ($name:ident) => { impl Serialize for $name { fn serialize(&self, _: S) -> Result { unreachable!(); } } impl<'a, T> Deserialize<'a> for $name { fn deserialize(_: D) -> Result<$name, D::Error> where D: Deserializer<'a>, { unreachable!(); } } }; } pub struct WebGLSender(crossbeam_channel::Sender); pub struct WebGLReceiver(crossbeam_channel::Receiver); impl Clone for WebGLSender { fn clone(&self) -> Self { WebGLSender(self.0.clone()) } } impl WebGLSender { #[inline] pub fn send(&self, data: T) -> Result<(), crossbeam_channel::SendError> { self.0.send(data) } } impl WebGLReceiver { #[inline] pub fn recv(&self) -> Result { self.0.recv() } #[inline] pub fn try_recv(&self) -> Result { self.0.try_recv() } pub fn into_inner(self) -> crossbeam_channel::Receiver { self.0 } } pub fn webgl_channel() -> Result<(WebGLSender, WebGLReceiver), ()> { let (sender, receiver) = crossbeam_channel::unbounded(); Ok((WebGLSender(sender), WebGLReceiver(receiver))) } unreachable_serializable!(WebGLReceiver); unreachable_serializable!(WebGLSender);