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