qemu_command_builder/
incoming.rs

1use crate::common::OnOff;
2use crate::to_command::{ToArg, ToCommand};
3use bon::Builder;
4use std::path::PathBuf;
5
6#[derive(Debug, Clone, Hash, Ord, PartialOrd, Eq, PartialEq, Builder)]
7pub struct Tcp {
8    host: Option<String>,
9    port: u16,
10    to: Option<u16>,
11    ipv4: Option<OnOff>,
12    ipv6: Option<OnOff>,
13}
14
15#[derive(Debug, Clone, Hash, Ord, PartialOrd, Eq, PartialEq, Builder)]
16pub struct Rdma {
17    host: String,
18    port: u16,
19    ipv4: Option<OnOff>,
20    ipv6: Option<OnOff>,
21}
22
23#[derive(Debug, Clone, Hash, Ord, PartialOrd, Eq, PartialEq, Builder)]
24pub struct File {
25    filename: PathBuf,
26    offset: Option<String>,
27}
28
29#[derive(Debug, Clone, Hash, Ord, PartialOrd, Eq, PartialEq)]
30pub enum Incoming {
31    Tcp(Tcp),
32    Rdma(Rdma),
33    Unix(PathBuf),
34    Fd(String),
35    File(File),
36    Exec(String),
37    Channel(String),
38    Defer,
39}
40
41impl ToCommand for Incoming {
42    fn to_command(&self) -> Vec<String> {
43        let mut cmd = vec![];
44
45        cmd.push("-incoming".to_string());
46
47        match self {
48            Incoming::Tcp(tcp) => {
49                let mut args = vec![];
50                if let Some(host) = &tcp.host {
51                    args.push(format!("tcp:{}:{}", host, tcp.port));
52                } else {
53                    args.push(format!("tcp::{}", tcp.port));
54                }
55                if let Some(to) = &tcp.to {
56                    args.push(format!("to={}", to));
57                }
58                if let Some(ipv4) = &tcp.ipv4 {
59                    args.push(format!("ipv4={}", ipv4.to_arg()));
60                }
61                if let Some(ipv6) = &tcp.ipv6 {
62                    args.push(format!("ipv6={}", ipv6.to_arg()));
63                }
64                cmd.push(args.join(","));
65            }
66            Incoming::Rdma(rdma) => {
67                let mut args = vec![];
68                args.push(format!("rdma:{}:{}", rdma.host, rdma.port));
69                if let Some(ipv4) = &rdma.ipv4 {
70                    args.push(format!("ipv4={}", ipv4.to_arg()));
71                }
72                if let Some(ipv6) = &rdma.ipv6 {
73                    args.push(format!("ipv6={}", ipv6.to_arg()));
74                }
75                cmd.push(args.join(","));
76            }
77            Incoming::Unix(unix) => {
78                cmd.push(format!("unix:{}", unix.display()));
79            }
80            Incoming::Fd(fd) => {
81                cmd.push(format!("fd:{}", fd));
82            }
83            Incoming::File(file) => {
84                let mut args = vec![format!("file:{}", file.filename.display())];
85                if let Some(offset) = &file.offset {
86                    args.push(format!("offset={}", offset));
87                }
88                cmd.push(args.join(","));
89            }
90            Incoming::Exec(exec) => {
91                cmd.push(format!("exec:{}", exec));
92            }
93            Incoming::Channel(chrono) => {
94                cmd.push(format!("channel:{}", chrono));
95            }
96            Incoming::Defer => {
97                cmd.push("defer".to_string());
98            }
99        }
100
101        cmd
102    }
103}