Skip to content

Commit 1dcb658

Browse files
committed
Fix being unable to add versioned dependency
Signed-off-by: itowlson <[email protected]>
1 parent b1cd480 commit 1dcb658

File tree

3 files changed

+21
-12
lines changed

3 files changed

+21
-12
lines changed

src/commands/add.rs

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,7 @@ impl AddCommand {
147147
bail!("No exported interfaces found in the component")
148148
};
149149

150-
let mut package_interface_map: HashMap<String, Vec<String>> = HashMap::new();
151-
let mut selected_interfaces: Vec<String> = Vec::new();
150+
let mut package_interface_map: HashMap<_, Vec<String>> = HashMap::new();
152151

153152
// Map interfaces to their respective packages
154153
for (package_name, interface) in exported_interfaces {
@@ -165,6 +164,8 @@ impl AddCommand {
165164
&package_names,
166165
)?;
167166

167+
let mut selected_interfaces = Vec::new();
168+
168169
for &package_idx in selected_package_indices.iter() {
169170
let package_name = &package_names[package_idx];
170171
let interfaces = package_interface_map.get(package_name).unwrap();
@@ -190,10 +191,19 @@ impl AddCommand {
190191
)?;
191192

192193
if interface_count > 1 && selected_interface_idx == 0 {
193-
selected_interfaces.push(package_name.clone());
194+
selected_interfaces.push(package_name.to_string());
194195
} else {
195196
let interface_name = &interface_options[selected_interface_idx];
196-
selected_interfaces.push(format!("{}/{}", package_name, interface_name));
197+
let full_itf_name = if let Some(version) = package_name.version.as_ref() {
198+
format!(
199+
"{ns}:{name}/{interface_name}@{version}",
200+
ns = package_name.namespace,
201+
name = package_name.name
202+
)
203+
} else {
204+
format!("{package_name}/{interface_name}")
205+
};
206+
selected_interfaces.push(full_itf_name);
197207
}
198208
}
199209

@@ -231,7 +241,7 @@ impl AddCommand {
231241

232242
for interface in selected_interfaces {
233243
component.dependencies.inner.insert(
234-
DependencyName::Package(DependencyPackageName::try_from(interface)?),
244+
DependencyName::Package(DependencyPackageName::try_from(interface.clone())?),
235245
component_dependency.clone(),
236246
);
237247
}

src/common/interact.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ pub fn select_prompt(
1414
Ok(select.interact()?)
1515
}
1616

17-
pub fn select_multiple_prompt(prompt: &str, selection_list: &[String]) -> Result<Vec<usize>> {
17+
pub fn select_multiple_prompt<T: ToString>(
18+
prompt: &str,
19+
selection_list: &[T],
20+
) -> Result<Vec<usize>> {
1821
Ok(MultiSelect::new()
1922
.with_prompt(prompt)
2023
.items(selection_list)

src/common/wit.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ pub fn parse_component_bytes(bytes: Vec<u8>) -> Result<(Resolve, PackageId)> {
4040
pub fn get_exported_interfaces(
4141
resolve: &Resolve,
4242
world_id: wit_parser::WorldId,
43-
) -> Vec<(String, String)> {
43+
) -> Vec<(wit_parser::PackageName, String)> {
4444
resolve.worlds[world_id]
4545
.exports
4646
.iter()
@@ -49,11 +49,7 @@ pub fn get_exported_interfaces(
4949
let i = &resolve.interfaces[*id];
5050
let pkg_id = i.package.unwrap();
5151
let pkg = &resolve.packages[pkg_id];
52-
let mut pkg_name = format!("{}:{}", pkg.name.namespace, pkg.name.name);
53-
if let Some(ver) = &pkg.name.version {
54-
pkg_name.push_str(&format!("@{}", ver));
55-
}
56-
Some((pkg_name, i.name.clone().unwrap_or_default()))
52+
Some((pkg.name.clone(), i.name.clone().unwrap_or_default()))
5753
}
5854
_ => None,
5955
})

0 commit comments

Comments
 (0)