From ecbb49f123162fa7b8da0716580047cbfe967b0b Mon Sep 17 00:00:00 2001 From: skaunov Date: Mon, 20 Apr 2026 19:53:59 +0300 Subject: [PATCH 1/9] fix `find_releases_with_asset` it never constructed `Err` variant --- src/boot_fake_node/mod.rs | 49 +++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/src/boot_fake_node/mod.rs b/src/boot_fake_node/mod.rs index c309b034..1d28f904 100644 --- a/src/boot_fake_node/mod.rs +++ b/src/boot_fake_node/mod.rs @@ -322,16 +322,17 @@ pub async fn find_releases_with_asset( ) -> Result> { let owner = owner.unwrap_or(HYPERWARE_OWNER); let repo = repo.unwrap_or(HYPERDRIVE_REPO); - let Ok(releases) = fetch_releases(owner, repo).await else { - warn!("Failed to fetch releases from {owner}/{repo}. Using empty"); - return Ok(vec![]); - }; - let filtered_releases: Vec = releases - .into_iter() - .filter(|release| release.assets.iter().any(|asset| asset.name == asset_name)) - .map(|release| release.tag_name) - .collect(); - Ok(filtered_releases) + let r = fetch_releases(owner, repo).await.map(|releases| { + releases + .into_iter() + .filter(|release| release.assets.iter().any(|asset| asset.name == asset_name)) + .map(|release| release.tag_name) + .collect() + }); + if r.is_err() { + warn!("Failed to fetch releases from {owner}/{repo}."); + } + r } pub async fn find_releases_with_asset_if_online( @@ -339,23 +340,25 @@ pub async fn find_releases_with_asset_if_online( repo: Option<&str>, asset_name: &str, ) -> Result> { - let remote_values = match find_releases_with_asset(owner, repo, asset_name).await { - Ok(v) => v, - Err(e) => match e.downcast_ref::() { - None => return Err(e), - Some(ee) => { - if ee.is_connect() { + let r = find_releases_with_asset(owner, repo, asset_name).await; + if let Err(e) = &r { + if let Some(ee) = e.downcast_ref::() { + if ee.is_connect() { + Ok( get_local_versions_with_prefix(&format!("{}v", LOCAL_PREFIX))? .iter() .map(|v| format!("v{}", v)) - .collect() - } else { - return Err(e); - } + .collect(), + ) + } else { + r } - }, - }; - Ok(remote_values) + } else { + r + } + } else { + r + } } #[instrument(level = "trace", skip_all)] From b5836a09fb6b3eab77227487b3ac3ca301bb2997 Mon Sep 17 00:00:00 2001 From: skaunov Date: Mon, 20 Apr 2026 20:24:27 +0300 Subject: [PATCH 2/9] style --- src/boot_fake_node/mod.rs | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/boot_fake_node/mod.rs b/src/boot_fake_node/mod.rs index 1d28f904..0d2c5bcc 100644 --- a/src/boot_fake_node/mod.rs +++ b/src/boot_fake_node/mod.rs @@ -344,21 +344,16 @@ pub async fn find_releases_with_asset_if_online( if let Err(e) = &r { if let Some(ee) = e.downcast_ref::() { if ee.is_connect() { - Ok( + return Ok( get_local_versions_with_prefix(&format!("{}v", LOCAL_PREFIX))? .iter() .map(|v| format!("v{}", v)) .collect(), ) - } else { - r } - } else { - r - } - } else { - r - } + } + } + r } #[instrument(level = "trace", skip_all)] From cdbea2f4f7364ccd755523b45fbd28a827f9515f Mon Sep 17 00:00:00 2001 From: skaunov Date: Mon, 20 Apr 2026 20:27:49 +0300 Subject: [PATCH 3/9] get the fine names back --- src/boot_fake_node/mod.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/boot_fake_node/mod.rs b/src/boot_fake_node/mod.rs index 0d2c5bcc..2c6c63a7 100644 --- a/src/boot_fake_node/mod.rs +++ b/src/boot_fake_node/mod.rs @@ -322,17 +322,17 @@ pub async fn find_releases_with_asset( ) -> Result> { let owner = owner.unwrap_or(HYPERWARE_OWNER); let repo = repo.unwrap_or(HYPERDRIVE_REPO); - let r = fetch_releases(owner, repo).await.map(|releases| { + let filtered_releases = fetch_releases(owner, repo).await.map(|releases| { releases .into_iter() .filter(|release| release.assets.iter().any(|asset| asset.name == asset_name)) .map(|release| release.tag_name) .collect() }); - if r.is_err() { + if filtered_releases.is_err() { warn!("Failed to fetch releases from {owner}/{repo}."); } - r + filtered_releases } pub async fn find_releases_with_asset_if_online( @@ -340,8 +340,8 @@ pub async fn find_releases_with_asset_if_online( repo: Option<&str>, asset_name: &str, ) -> Result> { - let r = find_releases_with_asset(owner, repo, asset_name).await; - if let Err(e) = &r { + let remote_values = find_releases_with_asset(owner, repo, asset_name).await; + if let Err(e) = &remote_values { if let Some(ee) = e.downcast_ref::() { if ee.is_connect() { return Ok( @@ -353,7 +353,7 @@ pub async fn find_releases_with_asset_if_online( } } } - r + remote_values } #[instrument(level = "trace", skip_all)] From b6c1d553e7213cf19bdb8c4fdc953804da310b04 Mon Sep 17 00:00:00 2001 From: skaunov Date: Mon, 20 Apr 2026 20:37:07 +0300 Subject: [PATCH 4/9] no need to reconstruct `Ok` --- src/boot_fake_node/mod.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/boot_fake_node/mod.rs b/src/boot_fake_node/mod.rs index 2c6c63a7..37962950 100644 --- a/src/boot_fake_node/mod.rs +++ b/src/boot_fake_node/mod.rs @@ -344,11 +344,10 @@ pub async fn find_releases_with_asset_if_online( if let Err(e) = &remote_values { if let Some(ee) = e.downcast_ref::() { if ee.is_connect() { - return Ok( - get_local_versions_with_prefix(&format!("{}v", LOCAL_PREFIX))? - .iter() - .map(|v| format!("v{}", v)) - .collect(), + return get_local_versions_with_prefix(&format!("{}v", LOCAL_PREFIX)) + .map( + |versions| versions.iter() + .map(|v| format!("v{}", v)).collect() ) } } From 8caaf9ace44cc99e0d192a8eafaacd318938791b Mon Sep 17 00:00:00 2001 From: skaunov Date: Mon, 20 Apr 2026 20:58:07 +0300 Subject: [PATCH 5/9] `..._or_default().first()` errors immediately for `Vec` --- src/boot_fake_node/mod.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/boot_fake_node/mod.rs b/src/boot_fake_node/mod.rs index 37962950..170249e3 100644 --- a/src/boot_fake_node/mod.rs +++ b/src/boot_fake_node/mod.rs @@ -185,10 +185,9 @@ async fn get_runtime_binary(version: &str, is_simulation_mode: bool) -> Result

Date: Mon, 20 Apr 2026 22:36:03 +0300 Subject: [PATCH 6/9] actually it's always a good idea to look for a local then panic on fetching error --- src/boot_fake_node/mod.rs | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/src/boot_fake_node/mod.rs b/src/boot_fake_node/mod.rs index 170249e3..44f065a5 100644 --- a/src/boot_fake_node/mod.rs +++ b/src/boot_fake_node/mod.rs @@ -184,8 +184,7 @@ async fn get_runtime_binary(version: &str, is_simulation_mode: bool) -> Result

Result< #[instrument(level = "trace", skip_all)] pub async fn fetch_releases(owner: &str, repo: &str) -> Result> { let bytes = get_from_github(owner, repo, "releases").await?; - if bytes.is_empty() { - return Ok(vec![]); - } - Ok(serde_json::from_slice(&bytes)?) + Ok( + if bytes.is_empty() {vec![]} + else {serde_json::from_slice(&bytes)?} + ) } #[instrument(level = "trace", skip_all)] @@ -329,8 +328,8 @@ pub async fn find_releases_with_asset( .collect() }); if filtered_releases.is_err() { - warn!("Failed to fetch releases from {owner}/{repo}."); - } + warn!("Failed to fetch releases from {owner}/{repo}.") + } else {tracing::trace!("Found releases. {filtered_releases:?}")} filtered_releases } @@ -340,18 +339,13 @@ pub async fn find_releases_with_asset_if_online( asset_name: &str, ) -> Result> { let remote_values = find_releases_with_asset(owner, repo, asset_name).await; - if let Err(e) = &remote_values { - if let Some(ee) = e.downcast_ref::() { - if ee.is_connect() { - return get_local_versions_with_prefix(&format!("{}v", LOCAL_PREFIX)) - .map( - |versions| versions.iter() - .map(|v| format!("v{}", v)).collect() - ) - } - } - } - remote_values + if remote_values.iter().flatten().next().is_none() { + tracing::debug!["nothing useful from remote fetching"]; + let r = get_local_versions_with_prefix(&format!("{}v", LOCAL_PREFIX)); + tracing::trace!("Using local versions. {r:?}"); + return r.map(|versions| versions.iter() + .map(|v| format!("v{}", v)).collect()) + } else {remote_values} } #[instrument(level = "trace", skip_all)] From f9eb1dbc8222a3feecb5ee305747e22b8efb3c1c Mon Sep 17 00:00:00 2001 From: skaunov Date: Mon, 20 Apr 2026 23:44:20 +0300 Subject: [PATCH 7/9] actually while fetching the thing it can get the local ones just in case --- src/boot_fake_node/mod.rs | 79 +++++++++++++++++++-------------------- src/main.rs | 8 +--- 2 files changed, 40 insertions(+), 47 deletions(-) diff --git a/src/boot_fake_node/mod.rs b/src/boot_fake_node/mod.rs index 44f065a5..98b656b8 100644 --- a/src/boot_fake_node/mod.rs +++ b/src/boot_fake_node/mod.rs @@ -139,38 +139,38 @@ pub fn get_platform_runtime_name(is_simulation_mode: bool) -> Result { if !uname.status.success() { return Err(eyre!("Could not determine OS.")); } - let os_name = std::str::from_utf8(&uname.stdout)?.trim(); + let os_name = std::str::from_utf8(&uname.stdout)?.trim(); - let uname_m = Command::new("uname").arg("-m").output()?; + let uname_m = Command::new("uname").arg("-m").output()?; if !uname_m.status.success() { return Err(eyre!("Could not determine architecture.")); } - let architecture_name = std::str::from_utf8(&uname_m.stdout)?.trim(); + let architecture_name = std::str::from_utf8(&uname_m.stdout)?.trim(); - // TODO: update when have binaries + // TODO: update when have binaries let zip_name_midfix = match (os_name, architecture_name) { - ("Linux", "x86_64") => "x86_64-unknown-linux-gnu", - ("Linux", "aarch64") => "aarch64-unknown-linux-gnu", - ("Darwin", "arm64") => "arm64-apple-darwin", - ("Darwin", "x86_64") => "x86_64-apple-darwin", - _ => { - return Err(eyre!( - "OS/Architecture {}/{} not amongst pre-built [Linux/x86_64, Linux/aarch64, Apple/arm64, Apple/x86_64].", - os_name, - architecture_name, - ).with_suggestion(|| "Use the `--runtime-path` flag to build a local copy of the https://github.com/hyperware-ai/hyperdrive repo") - ); - } + ("Linux", "x86_64") => "x86_64-unknown-linux-gnu", + ("Linux", "aarch64") => "aarch64-unknown-linux-gnu", + ("Darwin", "arm64") => "arm64-apple-darwin", + ("Darwin", "x86_64") => "x86_64-apple-darwin", + _ => { + return Err(eyre!( + "OS/Architecture {}/{} not amongst pre-built [Linux/x86_64, Linux/aarch64, Apple/arm64, Apple/x86_64].", + os_name, + architecture_name, + ).with_suggestion(|| "Use the `--runtime-path` flag to build a local copy of the https://github.com/hyperware-ai/hyperdrive repo") + ); + } }; Ok(format!( "hyperdrive-{}{}.zip", zip_name_midfix, - if is_simulation_mode { - "-simulation-mode" - } else { - "" - }, - )) + if is_simulation_mode { + "-simulation-mode" + } else { + "" + }, + )) } #[instrument(level = "trace", skip_all)] @@ -180,11 +180,7 @@ async fn get_runtime_binary(version: &str, is_simulation_mode: bool) -> Result

Result> { pub async fn find_releases_with_asset( owner: Option<&str>, repo: Option<&str>, - asset_name: &str, + asset_name: String, ) -> Result> { let owner = owner.unwrap_or(HYPERWARE_OWNER); let repo = repo.unwrap_or(HYPERDRIVE_REPO); @@ -333,19 +329,20 @@ pub async fn find_releases_with_asset( filtered_releases } -pub async fn find_releases_with_asset_if_online( - owner: Option<&str>, - repo: Option<&str>, - asset_name: &str, -) -> Result> { - let remote_values = find_releases_with_asset(owner, repo, asset_name).await; - if remote_values.iter().flatten().next().is_none() { - tracing::debug!["nothing useful from remote fetching"]; - let r = get_local_versions_with_prefix(&format!("{}v", LOCAL_PREFIX)); - tracing::trace!("Using local versions. {r:?}"); - return r.map(|versions| versions.iter() - .map(|v| format!("v{}", v)).collect()) - } else {remote_values} +pub async fn find_releases_with_asset_if_online(asset_name: String) -> Result> { + let values_remote = tokio::spawn(find_releases_with_asset( + None, None, asset_name + )); + let values_local = get_local_versions_with_prefix(&format!("{}v", LOCAL_PREFIX)); + tracing::trace!("Got local versions result. {values_local:?}"); + let values_local = values_local.map( + |versions| versions.iter().map(|v| format!("v{}", v)).collect() + ); + let values_remote = values_remote.await?; + if values_remote.iter().flatten().next().is_none() { + tracing::debug!("nothing useful from remote fetching, falling back to the local versions"); + values_local + } else {values_remote} } #[instrument(level = "trace", skip_all)] diff --git a/src/main.rs b/src/main.rs index 4f96df66..feccff31 100644 --- a/src/main.rs +++ b/src/main.rs @@ -605,9 +605,7 @@ async fn make_app(current_dir: &std::ffi::OsString) -> Result { .value_parser(PossibleValuesParser::new({ let mut possible_values = vec!["latest".to_string()]; let mut remote_values = boot_fake_node::find_releases_with_asset_if_online( - None, - None, - &boot_fake_node::get_platform_runtime_name(true)? + boot_fake_node::get_platform_runtime_name(true)? ).await.unwrap_or_default(); remote_values.truncate(MAX_REMOTE_VALUES); //if remote_values.len() == 0 { @@ -704,9 +702,7 @@ async fn make_app(current_dir: &std::ffi::OsString) -> Result { .value_parser(PossibleValuesParser::new({ let mut possible_values = vec!["latest".to_string()]; let mut remote_values = boot_fake_node::find_releases_with_asset_if_online( - None, - None, - &boot_fake_node::get_platform_runtime_name(false)? + boot_fake_node::get_platform_runtime_name(false)? ).await?; remote_values.truncate(MAX_REMOTE_VALUES); //if remote_values.len() == 0 { From a30c851773a30e78d15c5d1317e1357174a15eaf Mon Sep 17 00:00:00 2001 From: skaunov Date: Mon, 20 Apr 2026 23:51:55 +0300 Subject: [PATCH 8/9] fmt --- src/boot_fake_node/mod.rs | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/src/boot_fake_node/mod.rs b/src/boot_fake_node/mod.rs index 98b656b8..065bfd59 100644 --- a/src/boot_fake_node/mod.rs +++ b/src/boot_fake_node/mod.rs @@ -139,38 +139,38 @@ pub fn get_platform_runtime_name(is_simulation_mode: bool) -> Result { if !uname.status.success() { return Err(eyre!("Could not determine OS.")); } - let os_name = std::str::from_utf8(&uname.stdout)?.trim(); + let os_name = std::str::from_utf8(&uname.stdout)?.trim(); - let uname_m = Command::new("uname").arg("-m").output()?; + let uname_m = Command::new("uname").arg("-m").output()?; if !uname_m.status.success() { return Err(eyre!("Could not determine architecture.")); } - let architecture_name = std::str::from_utf8(&uname_m.stdout)?.trim(); + let architecture_name = std::str::from_utf8(&uname_m.stdout)?.trim(); - // TODO: update when have binaries + // TODO: update when have binaries let zip_name_midfix = match (os_name, architecture_name) { - ("Linux", "x86_64") => "x86_64-unknown-linux-gnu", - ("Linux", "aarch64") => "aarch64-unknown-linux-gnu", - ("Darwin", "arm64") => "arm64-apple-darwin", - ("Darwin", "x86_64") => "x86_64-apple-darwin", - _ => { - return Err(eyre!( + ("Linux", "x86_64") => "x86_64-unknown-linux-gnu", + ("Linux", "aarch64") => "aarch64-unknown-linux-gnu", + ("Darwin", "arm64") => "arm64-apple-darwin", + ("Darwin", "x86_64") => "x86_64-apple-darwin", + _ => { + return Err(eyre!( "OS/Architecture {}/{} not amongst pre-built [Linux/x86_64, Linux/aarch64, Apple/arm64, Apple/x86_64].", os_name, architecture_name, ).with_suggestion(|| "Use the `--runtime-path` flag to build a local copy of the https://github.com/hyperware-ai/hyperdrive repo") ); - } + } }; Ok(format!( "hyperdrive-{}{}.zip", zip_name_midfix, - if is_simulation_mode { - "-simulation-mode" - } else { - "" - }, - )) + if is_simulation_mode { + "-simulation-mode" + } else { + "" + }, + )) } #[instrument(level = "trace", skip_all)] @@ -330,9 +330,7 @@ pub async fn find_releases_with_asset( } pub async fn find_releases_with_asset_if_online(asset_name: String) -> Result> { - let values_remote = tokio::spawn(find_releases_with_asset( - None, None, asset_name - )); + let values_remote = tokio::spawn(find_releases_with_asset(None, None, asset_name)); let values_local = get_local_versions_with_prefix(&format!("{}v", LOCAL_PREFIX)); tracing::trace!("Got local versions result. {values_local:?}"); let values_local = values_local.map( From ef681b7a4d85abd67c1abf6a161d5c6cc9774f2b Mon Sep 17 00:00:00 2001 From: skaunov Date: Tue, 21 Apr 2026 00:03:07 +0300 Subject: [PATCH 9/9] style --- src/boot_fake_node/mod.rs | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/boot_fake_node/mod.rs b/src/boot_fake_node/mod.rs index 065bfd59..9d189b17 100644 --- a/src/boot_fake_node/mod.rs +++ b/src/boot_fake_node/mod.rs @@ -153,14 +153,11 @@ pub fn get_platform_runtime_name(is_simulation_mode: bool) -> Result { ("Linux", "aarch64") => "aarch64-unknown-linux-gnu", ("Darwin", "arm64") => "arm64-apple-darwin", ("Darwin", "x86_64") => "x86_64-apple-darwin", - _ => { - return Err(eyre!( - "OS/Architecture {}/{} not amongst pre-built [Linux/x86_64, Linux/aarch64, Apple/arm64, Apple/x86_64].", - os_name, - architecture_name, - ).with_suggestion(|| "Use the `--runtime-path` flag to build a local copy of the https://github.com/hyperware-ai/hyperdrive repo") - ); - } + _ => return Err(eyre!( + "OS/Architecture {}/{} not amongst pre-built [Linux/x86_64, Linux/aarch64, Apple/arm64, Apple/x86_64].", + os_name, + architecture_name, + ).with_suggestion(|| "Use the `--runtime-path` flag to build a local copy of the repo")) }; Ok(format!( "hyperdrive-{}{}.zip",