Skip to content

Commit 9ce04f2

Browse files
committed
fix: add project name to choice
1 parent 4a9f009 commit 9ce04f2

1 file changed

Lines changed: 44 additions & 28 deletions

File tree

src/utils/choice.rs

Lines changed: 44 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,76 @@
11
use anyhow::{Context, Result};
2+
use std::{collections::HashMap, fmt};
23

34
use crate::sdk::SDK;
45

56
use super::{config::Config, key::Key};
67

8+
#[derive(Debug)]
9+
struct DisplayProject<'a> {
10+
project_id: &'a str,
11+
project_name: &'a str,
12+
path: &'a str,
13+
}
14+
15+
impl fmt::Display for DisplayProject<'_> {
16+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
17+
write!(
18+
f,
19+
"{} - {} - {}",
20+
self.project_id, self.project_name, self.path
21+
)
22+
}
23+
}
24+
725
pub struct Choice {}
826
impl Choice {
927
pub fn get_key(partial_fingerprint: &str) -> Result<(Key, Config)> {
1028
let config = Config::get().context("Failed to get config")?;
1129
let key = config.get_key(partial_fingerprint)?;
1230
Ok((key, config))
1331
}
32+
1433
pub async fn choose_project(partial_fingerprint: &str) -> Result<String> {
1534
let (key, config) = Self::get_key(partial_fingerprint)?;
1635
let all_projects = SDK::list_projects(&key.fingerprint).await?;
1736

18-
let local_projects = config.projects.clone();
19-
20-
let all_projects = all_projects
37+
let project_name_map: HashMap<_, _> = all_projects
2138
.iter()
22-
.filter(|p| {
23-
!local_projects
24-
.iter()
25-
.any(|lp| lp.project_id == p.project_id)
26-
})
27-
.collect::<Vec<_>>();
39+
.map(|p| (&p.project_id, &p.project_name))
40+
.collect();
2841

29-
let mut options = local_projects
42+
let mut options = config
43+
.projects
3044
.iter()
31-
.map(|p| format!("{} - {}", p.project_id, p.path.to_str().unwrap()))
45+
.map(|p| {
46+
let pname = project_name_map.get(&p.project_id);
47+
DisplayProject {
48+
project_id: &p.project_id,
49+
project_name: match pname {
50+
Some(n) => n,
51+
None => "<unnamed>",
52+
},
53+
path: p.path.to_str().unwrap(),
54+
}
55+
})
3256
.collect::<Vec<_>>();
3357

3458
all_projects.iter().for_each(|p| {
35-
let pname = if p.project_name.trim().is_empty() {
36-
"<unnamed>"
37-
} else {
38-
&p.project_name
59+
let pname = match p.project_name.trim().is_empty() {
60+
true => "<unnamed>",
61+
false => &p.project_name,
3962
};
40-
options
41-
.push(format!("{} - {} - {}", p.project_id, pname, "Remote"));
63+
options.push(DisplayProject {
64+
project_id: &p.project_id,
65+
project_name: pname,
66+
path: "Remote",
67+
});
4268
});
4369

4470
let selected =
4571
crate::utils::prompt::prompt_options("Select project", options)?;
4672

47-
if selected.is_empty() {
48-
return Err(anyhow::anyhow!("No project selected"));
49-
}
50-
51-
let selected = selected
52-
.split(" - ")
53-
.map(|s| s.to_string())
54-
.collect::<Vec<String>>()[0]
55-
.clone();
56-
57-
Ok(selected)
73+
Ok(selected.project_id.to_string())
5874
}
5975

6076
pub async fn try_project(

0 commit comments

Comments
 (0)