rl_lang/interpreter/stdlib/net/
udp_recv_from.rs1use crate::interpreter::{
2 evaluator::Evaluator,
3 stdlib::{
4 common::{extract_number, verr, vok, vs},
5 net::NetHandle,
6 },
7 values::Value,
8};
9
10pub fn func(eval: &mut Evaluator, id: Value, max_bytes: Value) -> Value {
11 let id = match extract_number(id, "udp_recv_from") {
12 Ok(a) if a as i64 >= 0 => a as i64,
13 Ok(_) => {
14 return verr!(vs!(
15 "udp_recv_from: id handle cannot be negative".to_string()
16 ));
17 }
18 Err(e) => return verr!(vs!(format!("{}", e))),
19 };
20 let max_bytes = match extract_number(max_bytes, "udp_recv_from") {
21 Ok(a) => a as usize,
22 Err(e) => return verr!(vs!(format!("{}", e))),
23 };
24 let socket = match eval.net_handles.get(&id) {
25 Some(NetHandle::UdpSocket(socket)) => socket,
26 Some(_) => {
27 return verr!(vs!(format!(
28 "udp_recv_from: handle {} is not a UDP socket",
29 id
30 )));
31 }
32 None => return verr!(vs!(format!("udp_recv_from: unknown handle {}", id))),
33 };
34 let mut buf = vec![0u8; max_bytes];
35 match socket.recv_from(&mut buf) {
36 Ok((n, sender)) => {
37 buf.truncate(n);
38 let data = String::from_utf8_lossy(&buf).into_owned();
39 vok!(Value::Tuple(vec![vs!(data), vs!(sender.to_string())]))
40 }
41 Err(e) => verr!(vs!(format!("udp_recv_from: {}", e))),
42 }
43}