rl_lang/interpreter/stdlib/net/
tcp_set_timeout.rs1use 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}