Skip to content

Commit 07f5898

Browse files
authored
feat: allow plain output support (#163)
* rename plain to table * handle plain table output (disable arrangement, and don't use table border symbols). Rearrange some lines of code to be consistent * configue plain output for `describe` commands. These already have borders disabled
1 parent 5e6cccc commit 07f5898

File tree

6 files changed

+95
-43
lines changed

6 files changed

+95
-43
lines changed

rust/stackablectl/src/cli/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,9 +245,12 @@ CRDs."
245245
#[derive(Clone, Debug, Default, ValueEnum)]
246246
pub enum OutputType {
247247
/// Print output formatted as plain text
248-
#[default]
249248
Plain,
250249

250+
/// Print output formatted as a table
251+
#[default]
252+
Table,
253+
251254
/// Print output formatted as JSON
252255
Json,
253256

rust/stackablectl/src/cmds/demo.rs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -167,13 +167,17 @@ async fn list_cmd(args: &DemoListArgs, cli: &Cli, list: demo::List) -> Result<St
167167
info!("Listing demos");
168168

169169
match args.output_type {
170-
OutputType::Plain => {
171-
let mut table = Table::new();
170+
OutputType::Plain | OutputType::Table => {
171+
let (arrangement, preset) = match args.output_type {
172+
OutputType::Plain => (ContentArrangement::Disabled, NOTHING),
173+
_ => (ContentArrangement::Dynamic, UTF8_FULL),
174+
};
172175

176+
let mut table = Table::new();
173177
table
174-
.set_content_arrangement(ContentArrangement::Dynamic)
175178
.set_header(vec!["#", "NAME", "STACK", "DESCRIPTION"])
176-
.load_preset(UTF8_FULL);
179+
.set_content_arrangement(arrangement)
180+
.load_preset(preset);
177181

178182
for (index, (demo_name, demo_spec)) in list.inner().iter().enumerate() {
179183
let row = Row::from(vec![
@@ -219,11 +223,16 @@ async fn describe_cmd(
219223
})?;
220224

221225
match args.output_type {
222-
OutputType::Plain => {
226+
OutputType::Plain | OutputType::Table => {
227+
let arrangement = match args.output_type {
228+
OutputType::Plain => ContentArrangement::Disabled,
229+
_ => ContentArrangement::Dynamic,
230+
};
231+
223232
let mut table = Table::new();
224233
table
234+
.set_content_arrangement(arrangement)
225235
.load_preset(NOTHING)
226-
.set_content_arrangement(ContentArrangement::Dynamic)
227236
.add_row(vec!["DEMO", &args.demo_name])
228237
.add_row(vec!["DESCRIPTION", &demo.description])
229238
.add_row_if(

rust/stackablectl/src/cmds/operator.rs

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -175,13 +175,17 @@ async fn list_cmd(args: &OperatorListArgs, cli: &Cli) -> Result<String, CmdError
175175
let versions_list = build_versions_list(&helm_index_files)?;
176176

177177
match args.output_type {
178-
OutputType::Plain => {
179-
let mut table = Table::new();
178+
OutputType::Plain | OutputType::Table => {
179+
let (arrangement, preset) = match args.output_type {
180+
OutputType::Plain => (ContentArrangement::Disabled, NOTHING),
181+
_ => (ContentArrangement::Dynamic, UTF8_FULL),
182+
};
180183

184+
let mut table = Table::new();
181185
table
182-
.set_content_arrangement(ContentArrangement::Dynamic)
183186
.set_header(vec!["#", "OPERATOR", "STABLE VERSIONS"])
184-
.load_preset(UTF8_FULL);
187+
.set_content_arrangement(arrangement)
188+
.load_preset(preset);
185189

186190
for (index, (operator_name, versions)) in versions_list.iter().enumerate() {
187191
let versions_string = match versions.0.get(HELM_REPO_NAME_STABLE) {
@@ -226,7 +230,12 @@ async fn describe_cmd(args: &OperatorDescribeArgs, cli: &Cli) -> Result<String,
226230
let versions_list = build_versions_list_for_operator(&args.operator_name, &helm_index_files)?;
227231

228232
match args.output_type {
229-
OutputType::Plain => {
233+
OutputType::Plain | OutputType::Table => {
234+
let arrangement = match args.output_type {
235+
OutputType::Plain => ContentArrangement::Disabled,
236+
_ => ContentArrangement::Dynamic,
237+
};
238+
230239
let stable_versions_string = match versions_list.0.get(HELM_REPO_NAME_STABLE) {
231240
Some(v) => v.join(", "),
232241
None => "".into(),
@@ -244,7 +253,7 @@ async fn describe_cmd(args: &OperatorDescribeArgs, cli: &Cli) -> Result<String,
244253

245254
let mut table = Table::new();
246255
table
247-
.set_content_arrangement(ContentArrangement::Dynamic)
256+
.set_content_arrangement(arrangement)
248257
.load_preset(NOTHING)
249258
.add_row(vec!["OPERATOR", &args.operator_name.to_string()])
250259
.add_row(vec!["STABLE VERSIONS", stable_versions_string.as_str()])
@@ -359,23 +368,28 @@ fn installed_cmd(args: &OperatorInstalledArgs, cli: &Cli) -> Result<String, CmdE
359368
.collect();
360369

361370
match args.output_type {
362-
OutputType::Plain => {
371+
OutputType::Plain | OutputType::Table => {
363372
if installed.is_empty() {
364373
return Ok("No installed operators".into());
365374
}
366375

376+
let (arrangement, preset) = match args.output_type {
377+
OutputType::Plain => (ContentArrangement::Disabled, NOTHING),
378+
_ => (ContentArrangement::Dynamic, UTF8_FULL),
379+
};
380+
367381
let mut table = Table::new();
368382

369383
table
370-
.set_content_arrangement(ContentArrangement::Dynamic)
371-
.load_preset(UTF8_FULL)
372384
.set_header(vec![
373385
"OPERATOR",
374386
"VERSION",
375387
"NAMESPACE",
376388
"STATUS",
377389
"LAST UPDATED",
378-
]);
390+
])
391+
.set_content_arrangement(arrangement)
392+
.load_preset(preset);
379393

380394
for (release_name, release) in installed {
381395
table.add_row(vec![

rust/stackablectl/src/cmds/release.rs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -154,17 +154,21 @@ async fn list_cmd(
154154
info!("Listing releases");
155155

156156
match args.output_type {
157-
OutputType::Plain => {
157+
OutputType::Plain | OutputType::Table => {
158158
if release_list.inner().is_empty() {
159159
return Ok("No releases".into());
160160
}
161161

162-
let mut table = Table::new();
162+
let (arrangement, preset) = match args.output_type {
163+
OutputType::Plain => (ContentArrangement::Disabled, NOTHING),
164+
_ => (ContentArrangement::Dynamic, UTF8_FULL),
165+
};
163166

167+
let mut table = Table::new();
164168
table
165-
.set_content_arrangement(ContentArrangement::Dynamic)
166-
.load_preset(UTF8_FULL)
167-
.set_header(vec!["#", "RELEASE", "RELEASE DATE", "DESCRIPTION"]);
169+
.set_header(vec!["#", "RELEASE", "RELEASE DATE", "DESCRIPTION"])
170+
.set_content_arrangement(arrangement)
171+
.load_preset(preset);
168172

169173
for (index, (release_name, release_spec)) in release_list.inner().iter().enumerate() {
170174
table.add_row(vec![
@@ -207,13 +211,18 @@ async fn describe_cmd(
207211

208212
match release {
209213
Some(release) => match args.output_type {
210-
OutputType::Plain => {
214+
OutputType::Plain | OutputType::Table => {
215+
let arrangement = match args.output_type {
216+
OutputType::Plain => ContentArrangement::Disabled,
217+
_ => ContentArrangement::Dynamic,
218+
};
219+
211220
let mut product_table = Table::new();
212221

213222
product_table
223+
.set_header(vec!["PRODUCT", "OPERATOR VERSION"])
214224
.set_content_arrangement(ContentArrangement::Dynamic)
215-
.load_preset(NOTHING)
216-
.set_header(vec!["PRODUCT", "OPERATOR VERSION"]);
225+
.load_preset(NOTHING);
217226

218227
for (product_name, product) in &release.products {
219228
product_table.add_row(vec![product_name, &product.version.to_string()]);
@@ -222,7 +231,7 @@ async fn describe_cmd(
222231
let mut table = Table::new();
223232

224233
table
225-
.set_content_arrangement(ContentArrangement::Dynamic)
234+
.set_content_arrangement(arrangement)
226235
.load_preset(NOTHING)
227236
.add_row(vec!["RELEASE", &args.release])
228237
.add_row(vec!["RELEASE DATE", release.date.as_str()])

rust/stackablectl/src/cmds/stack.rs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -150,13 +150,17 @@ fn list_cmd(args: &StackListArgs, cli: &Cli, stack_list: stack::List) -> Result<
150150
info!("Listing stacks");
151151

152152
match args.output_type {
153-
OutputType::Plain => {
154-
let mut table = Table::new();
153+
OutputType::Plain | OutputType::Table => {
154+
let (arrangement, preset) = match args.output_type {
155+
OutputType::Plain => (ContentArrangement::Disabled, NOTHING),
156+
_ => (ContentArrangement::Dynamic, UTF8_FULL),
157+
};
155158

159+
let mut table = Table::new();
156160
table
157-
.set_content_arrangement(ContentArrangement::Dynamic)
158161
.set_header(vec!["#", "STACK", "RELEASE", "DESCRIPTION"])
159-
.load_preset(UTF8_FULL);
162+
.set_content_arrangement(arrangement)
163+
.load_preset(preset);
160164

161165
for (index, (stack_name, stack)) in stack_list.inner().iter().enumerate() {
162166
table.add_row(vec![
@@ -197,14 +201,19 @@ fn describe_cmd(
197201

198202
match stack_list.get(&args.stack_name) {
199203
Some(stack) => match args.output_type {
200-
OutputType::Plain => {
204+
OutputType::Plain | OutputType::Table => {
205+
let arrangement = match args.output_type {
206+
OutputType::Plain => ContentArrangement::Disabled,
207+
_ => ContentArrangement::Dynamic,
208+
};
209+
201210
let mut table = Table::new();
202211

203212
let mut parameter_table = Table::new();
204213

205214
parameter_table
206215
.set_header(vec!["NAME", "DESCRIPTION", "DEFAULT VALUE"])
207-
.set_content_arrangement(ContentArrangement::Dynamic)
216+
.set_content_arrangement(arrangement.clone())
208217
.load_preset(NOTHING);
209218

210219
for parameter in &stack.parameters {
@@ -216,7 +225,7 @@ fn describe_cmd(
216225
}
217226

218227
table
219-
.set_content_arrangement(ContentArrangement::Dynamic)
228+
.set_content_arrangement(arrangement)
220229
.load_preset(NOTHING)
221230
.add_row(vec!["STACK", args.stack_name.as_str()])
222231
.add_row(vec!["DESCRIPTION", stack.description.as_str()])

rust/stackablectl/src/cmds/stacklet.rs

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,12 @@ async fn list_cmd(args: &StackletListArgs, cli: &Cli) -> Result<String, CmdError
116116
}
117117

118118
match args.output_type {
119-
OutputType::Plain => {
119+
OutputType::Plain | OutputType::Table => {
120+
let (arrangement, preset) = match args.output_type {
121+
OutputType::Plain => (ContentArrangement::Disabled, NOTHING),
122+
_ => (ContentArrangement::Dynamic, UTF8_FULL),
123+
};
124+
120125
// The main table displays all installed (and discovered) stacklets
121126
// and their condition.
122127
let mut table = Table::new();
@@ -128,18 +133,21 @@ async fn list_cmd(args: &StackletListArgs, cli: &Cli) -> Result<String, CmdError
128133
"ENDPOINTS",
129134
"CONDITIONS",
130135
])
131-
.set_content_arrangement(ContentArrangement::Dynamic)
132-
.load_preset(UTF8_FULL);
136+
.set_content_arrangement(arrangement)
137+
.load_preset(preset);
133138

134139
let mut error_list = Vec::new();
135140
let mut error_index = 1;
136141

137-
let max_endpoint_name_length = stacklets
138-
.iter()
139-
.flat_map(|s| &s.endpoints)
140-
.map(|(endpoint_name, _)| endpoint_name.len())
141-
.max()
142-
.unwrap_or_default();
142+
let max_endpoint_name_length = match args.output_type {
143+
OutputType::Plain => 0,
144+
_ => stacklets
145+
.iter()
146+
.flat_map(|s| &s.endpoints)
147+
.map(|(endpoint_name, _)| endpoint_name.len())
148+
.max()
149+
.unwrap_or_default(),
150+
};
143151

144152
for stacklet in stacklets {
145153
let ConditionOutput { summary, errors } =
@@ -149,7 +157,7 @@ async fn list_cmd(args: &StackletListArgs, cli: &Cli) -> Result<String, CmdError
149157
.endpoints
150158
.iter()
151159
.map(|(name, url)| {
152-
format!("{name:width$}{url}", width = max_endpoint_name_length + 1)
160+
format!("{name:width$} {url}", width = max_endpoint_name_length + 1)
153161
})
154162
.collect::<Vec<_>>()
155163
.join("\n");

0 commit comments

Comments
 (0)