/* 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 http://mozilla.org/MPL/2.0/. */ use serde::{Deserialize, Serialize}; use serde::{Deserializer, Serializer}; use std::sync::mpsc; #[macro_use] 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(mpsc::Sender); pub struct WebGLReceiver(mpsc::Receiver); impl Clone for WebGLSender { fn clone(&self) -> Self { WebGLSender(self.0.clone()) } } impl WebGLSender { #[inline] pub fn send(&self, data: T) -> Result<(), mpsc::SendError> { self.0.send(data) } } impl WebGLReceiver { #[inline] pub fn recv(&self) -> Result { self.0.recv() } } pub fn webgl_channel() -> Result<(WebGLSender, WebGLReceiver), ()> { let (sender, receiver) = mpsc::channel(); Ok((WebGLSender(sender), WebGLReceiver(receiver))) } unreachable_serializable!(WebGLReceiver); unreachable_serializable!(WebGLSender);