Skip to main content

rl_lang/interpreter/stdlib/net/
tcp_write.rs

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