Skip to main content

rl_lang/interpreter/stdlib/net/
tcp_accept.rs

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