port/
port.rs

1use std::io;
2use std::sync::mpsc;
3use std::thread;
4
5use ei;
6
7fn main() {
8    let (sender, receiver) = mpsc::channel::<Vec<u8>>();
9
10    // port -> beam
11    let mut writer = ei::Writer::new(io::stdout());
12
13    thread::spawn(move || {
14        while let Ok(vec) = receiver.recv() {
15            writer.send(vec.as_slice()).unwrap()
16        }
17    });
18
19    // beam -> port
20    let mut reader = ei::Reader::new(io::stdin());
21
22    while let Ok(vec) = reader.recv() {
23        let s = sender.clone();
24        thread::spawn(move || {
25            let req: (u8, i64, i64, ei::Pid, ei::Atom, ei::Ref) =
26                ei::deserialize!(vec.as_slice()).unwrap();
27
28            let res = match req.0 {
29                0x61 => {
30                    let res = (ei::atom!("ok"), add(req.1, req.2), req.3, req.4, req.5);
31                    ei::serialize!(&res).unwrap()
32                }
33                0x73 => {
34                    let res = (ei::atom!("ok"), sub(req.1, req.2), req.3, req.4, req.5);
35                    ei::serialize!(&res).unwrap()
36                }
37                _ => {
38                    let res = (ei::atom!("error"), ei::atom!("undef"), req.3, req.4, req.5);
39                    ei::serialize!(&res).unwrap()
40                }
41            };
42
43            s.send(res).unwrap();
44        });
45    }
46}
47
48fn add(v1: i64, v2: i64) -> i64 {
49    v1 + v2
50}
51
52fn sub(v1: i64, v2: i64) -> i64 {
53    v1 - v2
54}