Skip to main content

rl_lang/interpreter/stdlib/net/
tcp_set_nonblocking.rs

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