Skip to main content

rl_lang/interpreter/stdlib/net/
udp_connect.rs

1use crate::interpreter::{
2    evaluator::Evaluator,
3    stdlib::{
4        common::{extract_number, extract_string, verr, vnl, vok, vs},
5        net::NetHandle,
6    },
7    values::Value,
8};
9
10pub fn func(eval: &mut Evaluator, id: Value, address: Value) -> Value {
11    let id = match extract_number(id, "udp_connect") {
12        Ok(a) if a as i64 >= 0 => a as i64,
13        Ok(_) => return verr!(vs!("udp_connect: id handle cannot be negative".to_string())),
14        Err(e) => return verr!(vs!(format!("udp_connect: {}", e))),
15    };
16    let addr = match extract_string(address, "udp_connect") {
17        Ok(s) => s,
18        Err(e) => return verr!(vs!(format!("udp_connect: {} ", e))),
19    };
20
21    let socket = match eval.net_handles.get(&id) {
22        Some(NetHandle::UdpSocket(socket)) => socket,
23        Some(_) => {
24            return verr!(vs!(format!(
25                "udp_connect: handle {} is not a UDP socket",
26                id
27            )));
28        }
29        None => return verr!(vs!(format!("udp_connect: unknown handle {}", id))),
30    };
31    match socket.connect(&addr) {
32        Ok(()) => vok!(vnl!()),
33        Err(e) => verr!(vs!(format!("udp_connect(\"{}\"): {}", addr, e))),
34    }
35}