aboutsummaryrefslogtreecommitdiff
path: root/alsa/src/communication.rs
blob: 3caf4cf1efefe9255c58c4b1869ccd0eb358182e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
use swaystatus_plugin::*;

use self::pipe_chan::{Sender, Receiver, SendError, ReceiveError, create_pipe_chan};

pub(crate) mod pipe_chan;

#[repr(C)]
pub enum MessagesFromMain {
    Quit,
    Refresh
}

pub(crate) struct MessagesFromMainReceiver{
    receiver : Receiver
}

pub(crate) struct MessagesFromMainSender{
    sender: Sender
}

pub(crate) fn make_sender_for_main() -> Result<(MessagesFromMainSender, MessagesFromMainReceiver),()>{
    create_pipe_chan().map(|(sender,receiver)| (MessagesFromMainSender{sender}, MessagesFromMainReceiver{receiver}))
}

impl MessagesFromMainSender {
    pub(crate) fn send(&self, message : MessagesFromMain) -> Result<(), SendError>{
        self.sender.send_byte(match message {
            MessagesFromMain::Quit => 0,
            MessagesFromMain::Refresh => 1,
        })
    }
}

impl MessagesFromMainReceiver {
    pub(crate) fn receive(&self) -> Result<Option<MessagesFromMain>, ReceiveError> {
        self.receiver.read_byte().map(|o| o.map(|b| match b {
            0 => MessagesFromMain::Quit,
            1 => MessagesFromMain::Refresh,
            _ => unreachable!()
        }))
    }
    pub(crate) fn file_handle(&self) -> &pipe_chan::FileHandle{
        self.receiver.file_handle()
    }
}

pub struct SenderForMain {
    sender : MessagesFromMainSender,
}

impl<'p> SenderForMain {
    pub fn new(sender : MessagesFromMainSender) -> Self {
        Self { sender }
    }
    
    fn send(&self, message : MessagesFromMain) -> Result<(), PluginCommunicationError> {
        self.sender.send(message).map_err(|_| PluginCommunicationError)
    }
}

impl MsgMainToModule for SenderForMain {
    fn send_quit(&self) -> Result<(),PluginCommunicationError> {
        self.send(MessagesFromMain::Quit)
    }
    fn send_refresh(&self) -> Result<(),PluginCommunicationError> {
        self.send(MessagesFromMain::Refresh)
    }
}