Skip to content

Commit ce2e49f

Browse files
committed
feat(cli): implement MultiSelect
Values for the MultiSelect are parsed as CSV. For common cases, it's simply separating values with commas, but it handles cases where characters need to be escaped properly.
1 parent 2bd4fc7 commit ce2e49f

5 files changed

Lines changed: 51 additions & 2 deletions

File tree

Cargo.lock

Lines changed: 22 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,4 @@ glob = "0.3"
6969
insta = "1"
7070
insta-cmd = "0.6"
7171
sysinfo = "0.36"
72+
csv = "1"

cli/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ dirs = { workspace = true }
2424
strum = { workspace = true }
2525
tabled = { workspace = true }
2626
terminal_size = { workspace = true }
27+
csv = { workspace = true }
2728

2829
[dev-dependencies]
2930
insta = { workspace = true }

cli/src/cli/device.rs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,21 @@ fn parse_setting_value(setting: &Setting, unparsed_value: String) -> anyhow::Res
231231
Value::String(name.into())
232232
}
233233
}
234-
Setting::MultiSelect { setting, values } => todo!(),
234+
Setting::MultiSelect { setting: _, .. } => {
235+
let mut reader = csv::ReaderBuilder::new()
236+
.has_headers(false)
237+
.from_reader(unparsed_value.as_bytes());
238+
let maybe_row = reader.records().next().transpose()?;
239+
let strings = maybe_row
240+
.map(|row| {
241+
row.into_iter()
242+
.map(|entry| Cow::from(entry.to_string()))
243+
.collect::<Vec<_>>()
244+
})
245+
.unwrap_or_default();
246+
247+
Value::StringVec(strings)
248+
}
235249
Setting::Equalizer { setting, .. } => {
236250
let values = unparsed_value
237251
.split(",")

cli/src/fmt.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,18 @@ impl std::fmt::Display for DisplayableValue {
6060
Value::I16Vec(items) => write!(f, "{items:?}"),
6161
Value::I32(value) => write!(f, "{value}"),
6262
Value::String(value) => write!(f, "{value}"),
63-
Value::StringVec(values) => write!(f, "{values:?}"),
63+
Value::StringVec(values) => {
64+
let mut buffer = Vec::new();
65+
let mut writer = csv::WriterBuilder::new()
66+
.has_headers(false)
67+
.from_writer(&mut buffer);
68+
// write the fields individually rather than write_record so that we don't get a newline at the end
69+
for value in values {
70+
writer.write_field(value.as_bytes()).unwrap();
71+
}
72+
std::mem::drop(writer);
73+
write!(f, "{}", String::from_utf8(buffer).unwrap())
74+
}
6475
Value::OptionalString(value) => {
6576
if let Some(value) = value {
6677
write!(f, "{value}")

0 commit comments

Comments
 (0)