websocat 4.0.0-alpha2

Command-line client for web sockets, like netcat/curl/socat for ws://.
Documentation
use super::{
    scenarioprinter::StrLit,
    types::{Endpoint, ScenarioPrintingEnvironment},
};

impl Endpoint {
    pub(super) fn begin_print_tcp(
        &self,
        env: &mut ScenarioPrintingEnvironment<'_>,
    ) -> anyhow::Result<String> {
        match self {
            Endpoint::TcpConnectByIp(addr) => {
                let varnam = env.vars.getnewvarname("tcp");
                env.printer.print_line(&format!(
                    "connect_tcp(#{{addr: {a}}}, |{varnam}| {{",
                    a = StrLit(addr)
                ));
                env.printer.increase_indent();
                Ok(varnam)
            }
            Endpoint::TcpConnectByEarlyHostname { varname_for_addrs } => {
                let varnam = env.vars.getnewvarname("tcp");
                env.printer.print_line(&format!(
                    "connect_tcp_race(#{{}}, {varname_for_addrs}, |{varnam}| {{"
                ));
                env.printer.increase_indent();
                Ok(varnam)
            }
            Endpoint::TcpConnectByLateHostname { hostname } => {
                let addrs = env.vars.getnewvarname("addrs");
                env.printer.print_line(&format!(
                    "lookup_host({h}, |{addrs}| {{",
                    h = StrLit(hostname)
                ));
                env.printer.increase_indent();

                let varnam = env.vars.getnewvarname("tcp");
                env.printer
                    .print_line(&format!("connect_tcp_race(#{{}}, {addrs}, |{varnam}| {{"));
                env.printer.increase_indent();
                Ok(varnam)
            }
            Endpoint::TcpListen(..)
            | Endpoint::TcpListenFd(..)
            | Endpoint::TcpListenFdNamed(..) => {
                let varnam = env.vars.getnewvarname("tcp");
                let fromaddr = env.vars.getnewvarname("from");
                let listenparams = env.opts.listening_parameters(env.position);

                let addrpart = match self {
                    Endpoint::TcpListen(addr) => {
                        format!("addr: {a}", a = StrLit(addr),)
                    }
                    Endpoint::TcpListenFd(fd) => {
                        format!("fd: {fd}",)
                    }
                    Endpoint::TcpListenFdNamed(fdname) => {
                        format!("named_fd: {a}", a = StrLit(fdname),)
                    }
                    _ => unreachable!(),
                };
                env.printer.print_line(&format!(
                    "listen_tcp(#{{{listenparams}, {addrpart}}}, |listen_addr|{{sequential([",
                ));
                env.printer.increase_indent();

                if env.opts.stdout_announce_listening_ports {
                    env.printer.print_line("print_stdout(\"LISTEN proto=tcp,ip=\"+listen_addr.get_ip()+\",port=\"+str(listen_addr.get_port())+\"\\n\"),");
                }
                if let Some(ref x) = env.opts.exec_after_listen {
                    if env.opts.exec_after_listen_append_port {
                        env.printer.print_line(&format!(
                            "system({} + \" \" + str(listen_addr.get_port())),",
                            StrLit(x)
                        ));
                    } else {
                        env.printer.print_line(&format!("system({}),", StrLit(x)));
                    }
                }

                env.printer.decrease_indent();
                env.printer
                    .print_line(&format!("])}},  |{varnam}, {fromaddr}| {{",));
                env.printer.increase_indent();

                Ok(varnam)
            }
            _ => panic!(),
        }
    }

    pub(super) fn end_print_tcp(&self, env: &mut ScenarioPrintingEnvironment<'_>) {
        match self {
            Endpoint::TcpConnectByIp(_) => {
                env.printer.decrease_indent();
                env.printer.print_line("})");
            }
            Endpoint::TcpConnectByEarlyHostname { .. } => {
                env.printer.decrease_indent();
                env.printer.print_line("})");
            }
            Endpoint::TcpListen(..)
            | Endpoint::TcpListenFd(..)
            | Endpoint::TcpListenFdNamed(..) => {
                env.printer.decrease_indent();
                env.printer.print_line("})");
            }
            Endpoint::TcpConnectByLateHostname { hostname: _ } => {
                env.printer.decrease_indent();
                env.printer.print_line("})");

                env.printer.decrease_indent();
                env.printer.print_line("})");
            }
            _ => panic!(),
        }
    }
}