Skip to content

Commit

Permalink
Propagate error when package not found
Browse files Browse the repository at this point in the history
  • Loading branch information
microbecode committed Jan 6, 2025
1 parent 50deffe commit adb8103
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 28 deletions.
14 changes: 9 additions & 5 deletions noir-libs/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,11 +63,15 @@ fn main() {
}

fn add_package(package_name: &str, version: &str) {
let used_version = crate::add::add(package_name, version);
println!(
"Successfully installed package {}@{} and updated configuration!",
package_name, used_version
);
match crate::add::add(package_name, version) {
Ok(ver) => println!(
"Successfully installed package {}@{} and updated configuration!",
package_name, ver
),
Err(err) => {
println!("Error: {}", err);
}
};
}

fn remove_package(package_name: &str) {
Expand Down
41 changes: 25 additions & 16 deletions noir-libs/src/network.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,20 +37,29 @@ pub fn download_remote(output_path: &Path, url: &str) {
///
/// This function will panic if the request fails, if the response cannot be read,
/// or if the JSON cannot be parsed correctly.
pub fn get_latest_version(url: String) -> String {
//println!("Downloading latest package from url {}", url);

let response = get(&url)
.expect("Failed to perform request")
.text()
.expect("Failed to read response text");

let json: Value = serde_json::from_str(&response).expect("Failed to parse JSON");

json["latest_version"]
.as_str()
.expect("Version field not found or is not a string")
.to_string()
pub fn get_latest_version(url: String) -> Result<String, String> {
println!("Downloading latest package from url {}", url);

let response = get(&url).map_err(|e| e.to_string())?;

if response.status().is_success() {
let aaa = &response.text().map_err(|e| e.to_string())?;
let json: Value = serde_json::from_str(aaa).map_err(|e| e.to_string())?;

Ok(json["latest_version"]
.as_str()
.ok_or("Version field not found or is not a string")?
.to_string())
} else {
let error_message = response.text().map_err(|e| e.to_string())?;
let json_error: Value = serde_json::from_str(&error_message).unwrap_or_default();
let message = json_error
.get("message")
.and_then(Value::as_str)
.unwrap_or("Unknown error");

Err(message.to_string())
}
}

#[cfg(test)]
Expand Down Expand Up @@ -95,7 +104,7 @@ mod tests {
.create();

let url = format!("{}/latest", url);
let version = get_latest_version(url);
let version = get_latest_version(url).unwrap();

assert_eq!(version, "1.2.3");
mock.assert();
Expand All @@ -113,7 +122,7 @@ mod tests {
let url = format!("{}/latest", url);

let result = std::panic::catch_unwind(|| {
get_latest_version(url);
get_latest_version(url).unwrap();
});

assert!(result.is_err());
Expand Down
13 changes: 6 additions & 7 deletions noir-libs/src/ops/add.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,16 @@ use crate::{
path::{get_cache_storage, get_package_dir, get_package_latest_url, get_package_url},
};

pub fn add(package_name: &str, version: &str) -> String {
pub fn add(package_name: &str, version: &str) -> Result<String, String> {
let cache_root = prepare_cache_dir();
let pwd = env::current_dir().expect("Unable to find current folder");

let used_version = get_used_version(package_name, version);
let used_version = get_used_version(package_name, version)?;

store_package(cache_root.clone(), pwd.clone(), package_name, &used_version);

add_dep_to_manifest(pwd, cache_root, package_name, &used_version);

used_version
Ok(used_version)
}

fn store_package(cache_root: PathBuf, project_dir: PathBuf, package_name: &str, version: &str) {
Expand Down Expand Up @@ -98,11 +97,11 @@ fn get_to_cache(cache_root: PathBuf, package_name: &str, version: &str) -> PathB
/// # Returns
///
/// Returns a `String` representing the version of the package.
fn get_used_version(package_name: &str, version: &str) -> String {
fn get_used_version(package_name: &str, version: &str) -> Result<String, String> {
if version == "latest" {
let latest_version_url = get_package_latest_url(package_name);
get_latest_version(latest_version_url).to_string()
get_latest_version(latest_version_url)
} else {
version.to_string()
Ok(version.to_string())
}
}
3 changes: 3 additions & 0 deletions src/manifest.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
let dependencies = doc
.entry("dependencies")
.or_insert_with(|| toml_edit::Item::Table(toml_edit::Table::new()));

0 comments on commit adb8103

Please sign in to comment.