qemu_command_builder/
incoming.rs1use 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}