Skip to main content

rl_lang/interpreter/stdlib/net/
udp_recv.rs

1use 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") {
12        Ok(a) if a as i64 >= 0 => a as i64,
13        Ok(_) => return verr!(vs!("udp_recv: id handle cannot be negative".to_string())),
14        Err(e) => return verr!(vs!(format!("udp_recv: {}", e))),
15    };
16    let max_bytes = match extract_number(max_bytes, "udp_recv") {
17        Ok(a) => a as usize,
18        Err(e) => return verr!(vs!(format!("udp_recv: {}", e))),
19    };
20    let socket = match eval.net_handles.get(&id) {
21        Some(NetHandle::UdpSocket(socket)) => socket,
22        Some(_) => {
23            return verr!(vs!(format!("udp_recv: handle {} is not a UDP socket", id)));
24        }
25        None => return verr!(vs!(format!("udp_recv: unknown handle {}", id))),
26    };
27    let mut buf = vec![0u8; max_bytes];
28    match socket.recv(&mut buf) {
29        Ok(n) => {
30            buf.truncate(n);
31            vok!(vs!(String::from_utf8_lossy(&buf).into_owned()))
32        }
33        Err(e) => verr!(vs!(format!("udp_recv: {}", e))),
34    }
35}