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