makepad_studio/build_manager/
build_client.rs

1#![allow(unused_imports)]
2#![allow(unused_variables)]
3#![allow(dead_code)]
4
5use {
6    crate::{
7        makepad_micro_serde::*,
8        makepad_platform::{*, cx_stdin::aux_chan},
9        build_manager::{
10            build_protocol::{BuildCmd, BuildCmdWrap, LogItemWrap, BuildCmdId},
11            build_server::{BuildConnection, BuildServer},
12        }
13    },
14    std::{
15        io::{Read, Write},
16        net::{TcpListener, TcpStream},
17        sync::mpsc::{self, Receiver, Sender, TryRecvError},
18        thread,
19        env,
20        path::PathBuf
21    },
22};
23
24pub struct BuildClient{
25    pub cmd_sender: Sender<BuildCmdWrap>,
26    pub log_signal: Signal,
27    pub log_receiver: Receiver<LogItemWrap>,
28}
29
30impl BuildClient {
31    
32    #[cfg(not(target_arch = "wasm32"))]
33    pub fn send_cmd(&self, cmd: BuildCmd)->BuildCmdId{
34        let cmd_id = BuildCmdId(LiveId::unique().0);
35        self.cmd_sender.send(BuildCmdWrap{
36            cmd_id,
37            cmd
38        }).unwrap();
39        cmd_id
40    }
41    
42    #[cfg(not(target_arch = "wasm32"))]
43    pub fn send_cmd_with_id(&self, cmd_id: BuildCmdId, cmd: BuildCmd){
44        self.cmd_sender.send(BuildCmdWrap{
45            cmd_id,
46            cmd
47        }).unwrap();
48    }
49    
50    #[cfg(target_arch = "wasm32")]
51    pub fn send_cmd(&self, _cmd: BuildCmd) ->BuildCmdId{
52        BuildCmdId(LiveId::unique().0)
53    }
54
55    #[cfg(target_arch = "wasm32")]
56    pub fn send_cmd_with_id(&self, cmd_id: BuildCmdId, cmd: BuildCmd){}
57     
58    pub fn handle_event(&mut self, cx: &mut Cx, event: &Event) -> Vec<LogItemWrap> {
59        let mut a = Vec::new();
60        self.handle_event_with(cx, event, &mut | _, v | a.push(v));
61        a
62    }
63    
64    pub fn handle_event_with(&mut self, cx: &mut Cx, event: &Event, dispatch_msg: &mut dyn FnMut(&mut Cx, LogItemWrap)) {
65        match event {
66            Event::Signal=>{
67                loop {
68                    match self.log_receiver.try_recv() {
69                        Ok(msg) => dispatch_msg(cx, msg),
70                        Err(TryRecvError::Empty) => break,
71                        _ => panic!(),
72                    }
73                }
74            }
75            _ => {}
76        }
77    }
78    
79    #[cfg(target_arch = "wasm32")]
80    pub fn new_with_local_server(_ubdir:&str) -> Self {
81        let (cmd_sender, _cmd_receiver) = mpsc::channel();
82        let msg_signal = LiveId::unique().into();
83        let (_msg_sender, msg_receiver) = mpsc::channel();
84        Self {
85            cmd_sender,
86            msg_signal,
87            msg_receiver,
88        }
89    }
90    
91    #[cfg(not(target_arch = "wasm32"))]
92    pub fn new_with_local_server(subdir:&str) -> Self {
93        let (cmd_sender, cmd_receiver) = mpsc::channel();
94        let log_signal = Signal::new();
95        let (log_sender, log_receiver) = mpsc::channel();
96        
97        let base_path = env::current_dir().unwrap();
98        let final_path = base_path.join(subdir.split('/').collect::<PathBuf>());
99        
100        let mut server = BuildServer::new(final_path);
101        spawn_local_cmd_handler(
102            cmd_receiver,
103            server.connect(Box::new({
104                let log_sender = log_sender.clone();
105                let log_signal = log_signal.clone();
106                move | log_item | {
107                    log_sender.send(log_item).unwrap();
108                    log_signal.set()
109                }
110            })),
111        );
112        /*spawn_connection_listener(TcpListener::bind("127.0.0.1:0").unwrap(), server);*/
113        
114        Self {
115            cmd_sender,
116            log_signal,
117            log_receiver,
118        }
119    }
120    
121}
122/*
123fn spawn_connection_listener(listener: TcpListener, mut server: BuildServer) {
124    thread::spawn(move || {
125        log!("Builder Server listening on {}", listener.local_addr().unwrap());
126        for stream in listener.incoming() {
127            let stream = stream.unwrap();
128            log!("Builder Incoming connection from {}", stream.peer_addr().unwrap());
129            let (msg_sender, msg_receiver) = mpsc::channel();
130            let connection = server.connect(Box::new({
131                let msg_sender = msg_sender.clone();
132                move | msg | {
133                    msg_sender.send(msg).unwrap();
134                }
135            }));
136            spawn_remote_cmd_handler(
137                connection,
138                stream.try_clone().unwrap(),
139            );
140            spawn_msg_sender(msg_receiver, stream);
141        }
142    });
143}*/
144/*
145fn spawn_remote_cmd_handler(
146    connection: BuildConnection,
147    mut stream: TcpStream,
148) {
149    thread::spawn(move || loop {
150        let mut len_bytes = [0; 4];
151        stream.read_exact(&mut len_bytes).unwrap();
152        let len = u32::from_be_bytes(len_bytes);
153        let mut request_bytes = vec![0; len as usize];
154        stream.read_exact(&mut request_bytes).unwrap();
155        
156        let cmd = DeBin::deserialize_bin(request_bytes.as_slice()).unwrap();
157        
158        connection.handle_cmd(cmd);
159    });
160}*/
161/*
162fn spawn_msg_sender(
163    msg_receiver: Receiver<BuildMsgWrap>,
164    mut stream: TcpStream,
165) {
166    thread::spawn(move || loop {
167        let msg = msg_receiver.recv().unwrap();
168        let mut msg_bytes = Vec::new();
169        
170        msg.ser_bin(&mut msg_bytes);
171        
172        let len_bytes = msg_bytes.len().to_be_bytes();
173        stream.write_all(&len_bytes).unwrap();
174        stream.write_all(&msg_bytes).unwrap();
175    });
176}
177
178fn _spawn_cmd_sender(cmd_receiver: Receiver<BuildCmdWrap>, mut stream: TcpStream) {
179    thread::spawn(move || loop {
180        let cmd = cmd_receiver.recv().unwrap();
181        let mut cmd_bytes = Vec::new();
182        cmd.ser_bin(&mut cmd_bytes);
183        let len_bytes = cmd_bytes.len().to_be_bytes();
184        stream.write_all(&len_bytes).unwrap();
185        stream.write_all(&cmd_bytes).unwrap();
186    });
187}
188
189fn _spawn_msg_receiver(
190    mut stream: TcpStream,
191    msg_signal: Signal,
192    msg_sender: Sender<BuildMsgWrap>,
193) {
194    thread::spawn(move || loop {
195        let mut len_bytes = [0; 4];
196        stream.read_exact(&mut len_bytes).unwrap();
197        
198        let len = u32::from_be_bytes(len_bytes);
199        let mut msg_bytes = vec![0; len as usize];
200        stream.read_exact(&mut msg_bytes).unwrap();
201        
202        let msg = DeBin::deserialize_bin(msg_bytes.as_slice()).unwrap();
203        
204        msg_sender.send(msg).unwrap();
205        msg_signal.set()
206    });
207}
208*/
209fn spawn_local_cmd_handler(
210    cmd_receiver: Receiver<BuildCmdWrap>,
211    connection: BuildConnection,
212) {
213    thread::spawn(move || while let Ok(cmd) = cmd_receiver.recv() {
214        connection.handle_cmd(cmd);
215    });
216}