1mod cmd;
3
4use clap::Parser;
5pub(crate) use cmd::cmd;
6pub use cmd::tap;
7use url::Url;
8use vector_lib::api_client::gql::TapEncodingFormat;
9
10use crate::config::api::default_graphql_url;
11
12#[derive(Parser, Debug, Clone)]
14#[command(rename_all = "kebab-case")]
15pub struct Opts {
16 #[arg(default_value = "500", short = 'i', long)]
18 interval: u32,
19
20 #[arg(short, long)]
22 url: Option<Url>,
23
24 #[arg(default_value = "100", short = 'l', long)]
26 limit: u32,
27
28 #[arg(default_value = "json", short = 'f', long)]
30 format: TapEncodingFormat,
31
32 #[arg(value_delimiter(','))]
34 component_id_patterns: Vec<String>,
35
36 #[arg(value_delimiter(','), long)]
38 outputs_of: Vec<String>,
39
40 #[arg(value_delimiter(','), long)]
42 inputs_of: Vec<String>,
43
44 #[arg(short, long)]
46 quiet: bool,
47
48 #[arg(short, long)]
50 meta: bool,
51
52 #[arg(short, long)]
54 no_reconnect: bool,
55
56 #[arg(short = 'd', long)]
58 duration_ms: Option<u64>,
59}
60
61impl Opts {
62 pub fn outputs_patterns(&self) -> Vec<String> {
66 if self.component_id_patterns.is_empty()
67 && self.outputs_of.is_empty()
68 && self.inputs_of.is_empty()
69 {
70 vec!["*".to_string()]
71 } else {
72 self.outputs_of
73 .iter()
74 .cloned()
75 .chain(self.component_id_patterns.iter().cloned())
76 .collect()
77 }
78 }
79
80 pub fn url(&self) -> Url {
83 self.url.clone().unwrap_or_else(default_graphql_url)
84 }
85
86 pub fn web_socket_url(&self) -> Url {
88 let mut url = self.url();
89 url.set_scheme(match url.scheme() {
90 "https" => "wss",
91 _ => "ws",
92 })
93 .expect("Couldn't build WebSocket URL. Please report.");
94
95 url
96 }
97}