Skip to main content

rl_lang/interpreter/stdlib/net/
tcp_set_timeout.rs

1use std::time::Duration;
2
3use crate::interpreter::{
4    evaluator::Evaluator,
5    stdlib::{
6        common::{extract_number, verr, vnl, vok, vs},
7        net::NetHandle,
8    },
9    values::Value,
10};
11
12pub fn func(eval: &mut Evaluator, id: Value, millis: Value) -> Value {
13    let id = match extract_number(id, "tcp_set_timeout") {
14        Ok(a) if a as i64 >= 0 => a as i64,
15        Ok(_) => return verr!(vs!("tcp_accept: id handle cannot be negative".to_string())),
16        Err(e) => return verr!(vs!(format!("tcp_set_timeout: {}", e))),
17    };
18    let millis = match extract_number(millis, "tcp_set_timeout") {
19        Ok(a) => a,
20        Err(e) => return verr!(vs!(format!("tcp_set_timeout: {}", e))),
21    };
22
23    let stream = match eval.net_handles.get(&id) {
24        Some(NetHandle::TcpStream(stream)) => stream,
25        Some(_) => {
26            return verr!(vs!(format!(
27                "tcp_set_timeout: handle {} is not a TCP stream",
28                id
29            )));
30        }
31        None => return verr!(vs!(format!("tcp_set_timeout: unknown handle {}", id))),
32    };
33    let duration = if millis == 0 {
34        None
35    } else {
36        Some(Duration::from_millis(millis))
37    };
38    let result = stream
39        .set_read_timeout(duration)
40        .and_then(|_| stream.set_write_timeout(duration));
41    match result {
42        Ok(()) => vok!(vnl!()),
43        Err(e) => verr!(vs!(format!("tcp_set_timeout: {}", e))),
44    }
45}