1use base::generic_channel;
6use crossbeam_channel::{Receiver, Sender, TryRecvError, unbounded};
7use log::warn;
8
9use crate::ServoError;
10
11pub(crate) struct ServoErrorSender {
15 sender: Sender<ServoError>,
16}
17
18impl ServoErrorSender {
19 pub(crate) fn raise_response_send_error(&self, error: generic_channel::SendError) {
20 if let Err(error) = self.sender.send(ServoError::ResponseFailedToSend(error)) {
21 warn!("Failed to send Servo error: {error:?}");
22 }
23 }
24}
25
26pub(crate) struct ServoErrorChannel {
30 sender: Sender<ServoError>,
31 receiver: Receiver<ServoError>,
32}
33
34impl Default for ServoErrorChannel {
35 fn default() -> Self {
36 let (sender, receiver) = unbounded();
37 Self { sender, receiver }
38 }
39}
40
41impl ServoErrorChannel {
42 pub(crate) fn sender(&self) -> ServoErrorSender {
43 ServoErrorSender {
44 sender: self.sender.clone(),
45 }
46 }
47
48 pub(crate) fn try_recv(&self) -> Option<ServoError> {
49 match self.receiver.try_recv() {
50 Ok(result) => Some(result),
51 Err(error) => {
52 debug_assert_eq!(error, TryRecvError::Empty);
53 None
54 },
55 }
56 }
57}