mirror of
https://github.com/mii443/wasmer.git
synced 2025-12-06 12:48:20 +00:00
cargo fmt
This commit is contained in:
@@ -199,21 +199,28 @@ fn parse_cli_args() -> Result<(), anyhow::Error> {
|
||||
#[cfg(feature = "binfmt")]
|
||||
(Some("binfmt"), _) => Binfmt::try_parse_from(args_without_first_arg.iter())?.execute(),
|
||||
(Some("list"), Some("--installed")) => {
|
||||
use prettytable::{format, Table, row};
|
||||
use prettytable::{format, row, Table};
|
||||
|
||||
let rows = get_all_local_packages()
|
||||
.into_iter()
|
||||
.map(|pkg| {
|
||||
|
||||
let commands = pkg.manifest.command
|
||||
let commands = pkg
|
||||
.manifest
|
||||
.command
|
||||
.unwrap_or_default()
|
||||
.iter()
|
||||
.map(|c| c.get_name())
|
||||
.collect::<Vec<_>>()
|
||||
.join(" \r\n");
|
||||
|
||||
row![pkg.registry.clone(), pkg.name.clone(), pkg.version.clone(), commands]
|
||||
}).collect::<Vec<_>>();
|
||||
row![
|
||||
pkg.registry.clone(),
|
||||
pkg.name.clone(),
|
||||
pkg.version.clone(),
|
||||
commands
|
||||
]
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
let mut table = Table::init(rows);
|
||||
table.set_titles(row!["Registry", "Package", "Version", "Commands"]);
|
||||
@@ -251,11 +258,10 @@ fn parse_cli_args() -> Result<(), anyhow::Error> {
|
||||
}
|
||||
|
||||
// else: local package not found
|
||||
let sp =
|
||||
spinner::SpinnerBuilder::new(format!("Installing package {package} ..."))
|
||||
let sp = spinner::SpinnerBuilder::new(format!("Installing package {package} ..."))
|
||||
.spinner(vec![
|
||||
"⣾", "⣽", "⣻", "⢿", "⡿", "⣟", "⣯", "⣷", " ", "⠁", "⠂", "⠄", "⡀",
|
||||
"⢀", "⠠", "⠐", "⠈",
|
||||
"⣾", "⣽", "⣻", "⢿", "⡿", "⣟", "⣯", "⣷", " ", "⠁", "⠂", "⠄", "⡀", "⢀", "⠠",
|
||||
"⠐", "⠈",
|
||||
])
|
||||
.start();
|
||||
|
||||
@@ -271,7 +277,7 @@ fn parse_cli_args() -> Result<(), anyhow::Error> {
|
||||
return RunWithoutFile::try_parse_from(args_without_package.iter())?
|
||||
.into_run_args(o)
|
||||
.execute();
|
||||
},
|
||||
}
|
||||
Err(e) => {
|
||||
println!("{e}");
|
||||
return Ok(());
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::env;
|
||||
use std::collections::BTreeMap;
|
||||
use std::env;
|
||||
use std::path::{Path, PathBuf};
|
||||
|
||||
use serde::Deserialize;
|
||||
use serde::Serialize;
|
||||
|
||||
pub mod graphql {
|
||||
|
||||
use core::time;
|
||||
use graphql_client::*;
|
||||
#[cfg(not(target_os = "wasi"))]
|
||||
use reqwest::{
|
||||
blocking::{multipart::Form, Client},
|
||||
header::USER_AGENT,
|
||||
};
|
||||
use core::time;
|
||||
use std::env;
|
||||
use std::time::Duration;
|
||||
#[cfg(target_os = "wasi")]
|
||||
@@ -253,13 +253,7 @@ pub mod graphql {
|
||||
for<'de> R: serde::Deserialize<'de>,
|
||||
V: serde::Serialize,
|
||||
{
|
||||
execute_query_modifier_inner(
|
||||
registry_url,
|
||||
login_token,
|
||||
query,
|
||||
Some(timeout),
|
||||
|f| f
|
||||
)
|
||||
execute_query_modifier_inner(registry_url, login_token, query, Some(timeout), |f| f)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -356,14 +350,12 @@ fn format_graphql(registry: &str) -> String {
|
||||
}
|
||||
|
||||
impl PartialWapmConfig {
|
||||
|
||||
pub fn from_file() -> Result<Self, String> {
|
||||
let path = Self::get_file_location()?;
|
||||
|
||||
match std::fs::read_to_string(&path) {
|
||||
Ok(config_toml) => {
|
||||
toml::from_str(&config_toml)
|
||||
.map_err(|e| format!("could not parse {path:?}: {e}"))
|
||||
toml::from_str(&config_toml).map_err(|e| format!("could not parse {path:?}: {e}"))
|
||||
}
|
||||
Err(_e) => Ok(Self::default()),
|
||||
}
|
||||
@@ -379,10 +371,7 @@ impl PartialWapmConfig {
|
||||
|
||||
pub fn get_folder() -> Result<PathBuf, String> {
|
||||
Ok(
|
||||
if let Some(folder_str) = env::var("WASMER_DIR")
|
||||
.ok()
|
||||
.filter(|s| !s.is_empty())
|
||||
{
|
||||
if let Some(folder_str) = env::var("WASMER_DIR").ok().filter(|s| !s.is_empty()) {
|
||||
let folder = PathBuf::from(folder_str);
|
||||
std::fs::create_dir_all(folder.clone())
|
||||
.map_err(|e| format!("cannot create config directory: {e}"))?;
|
||||
@@ -426,13 +415,26 @@ pub fn get_command_local(name: &str) -> Result<PathBuf, String> {
|
||||
Err(format!("unimplemented"))
|
||||
}
|
||||
|
||||
pub fn get_package_local_dir(registry_host: &str, name: &str, version: &str) -> Result<PathBuf, String> {
|
||||
pub fn get_package_local_dir(
|
||||
registry_host: &str,
|
||||
name: &str,
|
||||
version: &str,
|
||||
) -> Result<PathBuf, String> {
|
||||
if !name.contains("/") {
|
||||
return Err(format!("package name has to be in the format namespace/package: {name:?}"));
|
||||
return Err(format!(
|
||||
"package name has to be in the format namespace/package: {name:?}"
|
||||
));
|
||||
}
|
||||
let namespace = name.split("/").nth(0).ok_or(format!("missing namespace for {name:?}"))?;
|
||||
let name = name.split("/").nth(1).ok_or(format!("missing name for {name:?}"))?;
|
||||
let install_dir = get_global_install_dir(registry_host).ok_or(format!("no install dir for {name:?}"))?;
|
||||
let namespace = name
|
||||
.split("/")
|
||||
.nth(0)
|
||||
.ok_or(format!("missing namespace for {name:?}"))?;
|
||||
let name = name
|
||||
.split("/")
|
||||
.nth(1)
|
||||
.ok_or(format!("missing name for {name:?}"))?;
|
||||
let install_dir =
|
||||
get_global_install_dir(registry_host).ok_or(format!("no install dir for {name:?}"))?;
|
||||
Ok(install_dir.join(namespace).join(name).join(version))
|
||||
}
|
||||
|
||||
@@ -446,8 +448,9 @@ pub struct LocalPackage {
|
||||
}
|
||||
|
||||
fn get_all_names_in_dir(dir: &PathBuf) -> Vec<(PathBuf, String)> {
|
||||
|
||||
if !dir.is_dir() { return Vec::new(); }
|
||||
if !dir.is_dir() {
|
||||
return Vec::new();
|
||||
}
|
||||
|
||||
let read_dir = match std::fs::read_dir(dir) {
|
||||
Ok(o) => o,
|
||||
@@ -465,19 +468,15 @@ fn get_all_names_in_dir(dir: &PathBuf) -> Vec<(PathBuf, String)> {
|
||||
|
||||
registry_entries
|
||||
.into_iter()
|
||||
.filter_map(|re| {
|
||||
Some((re.clone(), re.file_name()?.to_str()?.to_string()))
|
||||
})
|
||||
.filter_map(|re| Some((re.clone(), re.file_name()?.to_str()?.to_string())))
|
||||
.collect()
|
||||
}
|
||||
|
||||
/// Returns a list of all locally installed packages
|
||||
pub fn get_all_local_packages() -> Vec<LocalPackage> {
|
||||
|
||||
let mut packages = Vec::new();
|
||||
|
||||
'outer: for registry in get_all_available_registries().unwrap_or_default() {
|
||||
|
||||
let root_dir = match get_global_install_dir(®istry) {
|
||||
Some(o) => o,
|
||||
None => continue 'outer,
|
||||
@@ -513,9 +512,13 @@ pub fn get_local_package(name: &str, version: Option<&str>) -> Option<LocalPacka
|
||||
get_all_local_packages()
|
||||
.iter()
|
||||
.filter(|p| {
|
||||
if p.name != name { return false; }
|
||||
if p.name != name {
|
||||
return false;
|
||||
}
|
||||
if let Some(v) = version {
|
||||
if p.version != v { return false; }
|
||||
if p.version != v {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
true
|
||||
})
|
||||
@@ -523,8 +526,11 @@ pub fn get_local_package(name: &str, version: Option<&str>) -> Option<LocalPacka
|
||||
.next()
|
||||
}
|
||||
|
||||
pub fn get_package_local_wasm_file(registry_host: &str, name: &str, version: &str) -> Result<PathBuf, String> {
|
||||
|
||||
pub fn get_package_local_wasm_file(
|
||||
registry_host: &str,
|
||||
name: &str,
|
||||
version: &str,
|
||||
) -> Result<PathBuf, String> {
|
||||
let dir = get_package_local_dir(registry_host, name, version)?;
|
||||
let wapm_toml_path = dir.join("wapm.toml");
|
||||
let wapm_toml_str = std::fs::read_to_string(&wapm_toml_path)
|
||||
@@ -533,11 +539,14 @@ pub fn get_package_local_wasm_file(registry_host: &str, name: &str, version: &st
|
||||
.map_err(|e| format!("cannot parse wapm.toml for {name}@{version}"))?;
|
||||
|
||||
// TODO: this will just return the path for the first command, so this might not be correct
|
||||
let command_name = wapm.command
|
||||
let command_name = wapm
|
||||
.command
|
||||
.unwrap_or_default()
|
||||
.first()
|
||||
.map(|m| m.get_module())
|
||||
.ok_or(format!("cannot get entrypoint for {name}@{version}: package has no commands"))?;
|
||||
.ok_or(format!(
|
||||
"cannot get entrypoint for {name}@{version}: package has no commands"
|
||||
))?;
|
||||
|
||||
Ok(dir.join(command_name))
|
||||
}
|
||||
@@ -553,11 +562,7 @@ pub fn query_package_from_registry(
|
||||
name: &str,
|
||||
version: Option<&str>,
|
||||
) -> Result<PackageDownloadInfo, (Vec<PackageDownloadInfo>, String)> {
|
||||
|
||||
use crate::graphql::{
|
||||
GetPackagesQuery, get_packages_query,
|
||||
execute_query
|
||||
};
|
||||
use crate::graphql::{execute_query, get_packages_query, GetPackagesQuery};
|
||||
use graphql_client::GraphQLQuery;
|
||||
|
||||
let q = if name.contains("/") {
|
||||
@@ -574,10 +579,10 @@ pub fn query_package_from_registry(
|
||||
let response: get_packages_query::ResponseData = execute_query(registry_url, "", &q)
|
||||
.map_err(|e| (Vec::new(), format!("Error sending GetPackagesQuery: {e}")))?;
|
||||
|
||||
let available_packages = response.package
|
||||
let available_packages = response
|
||||
.package
|
||||
.iter()
|
||||
.filter_map(|p| {
|
||||
|
||||
let p = p.as_ref()?;
|
||||
let mut versions = Vec::new();
|
||||
|
||||
@@ -594,11 +599,13 @@ pub fn query_package_from_registry(
|
||||
|
||||
version: v.version.clone(),
|
||||
|
||||
commands: toml::from_str::<wapm_toml::Manifest>(
|
||||
&v.manifest
|
||||
).ok()?
|
||||
.command.unwrap_or_default()
|
||||
.iter().map(|s| s.get_name()).collect(),
|
||||
commands: toml::from_str::<wapm_toml::Manifest>(&v.manifest)
|
||||
.ok()?
|
||||
.command
|
||||
.unwrap_or_default()
|
||||
.iter()
|
||||
.map(|s| s.get_name())
|
||||
.collect(),
|
||||
|
||||
url: v.distribution.download_url.clone(),
|
||||
});
|
||||
@@ -612,7 +619,8 @@ pub fn query_package_from_registry(
|
||||
.flat_map(|v| v.into_iter())
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
let queried_package = available_packages.iter()
|
||||
let queried_package = available_packages
|
||||
.iter()
|
||||
.filter_map(|v| {
|
||||
if name.contains("/") && v.package != name {
|
||||
return None;
|
||||
@@ -623,10 +631,18 @@ pub fn query_package_from_registry(
|
||||
}
|
||||
|
||||
Some(v)
|
||||
}).next().cloned();
|
||||
})
|
||||
.next()
|
||||
.cloned();
|
||||
|
||||
match queried_package {
|
||||
None => Err((available_packages, format!("No package found for {name}@{}", version.unwrap_or("latest")))),
|
||||
None => Err((
|
||||
available_packages,
|
||||
format!(
|
||||
"No package found for {name}@{}",
|
||||
version.unwrap_or("latest")
|
||||
),
|
||||
)),
|
||||
Some(s) => Ok(s),
|
||||
}
|
||||
}
|
||||
@@ -634,18 +650,18 @@ pub fn query_package_from_registry(
|
||||
/// Returs the path to the directory where all packages on this computer are being stored
|
||||
pub fn get_global_install_dir(registry_host: &str) -> Option<PathBuf> {
|
||||
Some(
|
||||
PartialWapmConfig::get_folder().ok()?
|
||||
PartialWapmConfig::get_folder()
|
||||
.ok()?
|
||||
.join("checkouts")
|
||||
.join(registry_host),
|
||||
)
|
||||
}
|
||||
|
||||
pub fn download_and_unpack_targz(url: &str, target_path: &Path) -> Result<PathBuf, String> {
|
||||
|
||||
let target_targz_path = target_path.to_path_buf().join("package.tar.gz");
|
||||
|
||||
let mut resp = reqwest::blocking::get(url)
|
||||
.map_err(|e| format!("failed to download {url}: {e}"))?;
|
||||
let mut resp =
|
||||
reqwest::blocking::get(url).map_err(|e| format!("failed to download {url}: {e}"))?;
|
||||
|
||||
if !target_targz_path.exists() {
|
||||
// create all the parent paths, only remove the created directory, not the parent dirs
|
||||
@@ -654,17 +670,24 @@ pub fn download_and_unpack_targz(url: &str, target_path: &Path) -> Result<PathBu
|
||||
}
|
||||
|
||||
{
|
||||
let mut file = std::fs::File::create(&target_targz_path)
|
||||
.map_err(|e| format!("failed to download {url} into {}: {e}", target_targz_path.display()))?;
|
||||
let mut file = std::fs::File::create(&target_targz_path).map_err(|e| {
|
||||
format!(
|
||||
"failed to download {url} into {}: {e}",
|
||||
target_targz_path.display()
|
||||
)
|
||||
})?;
|
||||
|
||||
reqwest::blocking::get(url)
|
||||
.map_err(|e| format!("{e}"))?;
|
||||
reqwest::blocking::get(url).map_err(|e| format!("{e}"))?;
|
||||
|
||||
resp.copy_to(&mut file).map_err(|e| format!("{e}"))?;
|
||||
}
|
||||
|
||||
let file = std::fs::File::open(&target_targz_path)
|
||||
.map_err(|e| format!("failed to download {url} into {}: {e}", target_targz_path.display()))?;
|
||||
let file = std::fs::File::open(&target_targz_path).map_err(|e| {
|
||||
format!(
|
||||
"failed to download {url} into {}: {e}",
|
||||
target_targz_path.display()
|
||||
)
|
||||
})?;
|
||||
|
||||
let gz_decoded = flate2::read::GzDecoder::new(file);
|
||||
let mut ar = tar::Archive::new(gz_decoded);
|
||||
@@ -677,7 +700,6 @@ pub fn download_and_unpack_targz(url: &str, target_path: &Path) -> Result<PathBu
|
||||
}
|
||||
|
||||
pub fn install_package(name: &str, version: Option<&str>) -> Result<PathBuf, String> {
|
||||
|
||||
let registries = get_all_available_registries()?;
|
||||
let mut url_of_package = None;
|
||||
let mut error_packages = Vec::new();
|
||||
@@ -691,10 +713,10 @@ pub fn install_package(name: &str, version: Option<&str>) -> Result<PathBuf, Str
|
||||
Ok(o) => {
|
||||
url_of_package = Some((r, o));
|
||||
break;
|
||||
},
|
||||
}
|
||||
Err(e) => {
|
||||
error_packages.push(e);
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -709,13 +731,15 @@ pub fn install_package(name: &str, version: Option<&str>) -> Result<PathBuf, Str
|
||||
.filter_map(|s| Some(format!("{}", s.host_str()?)))
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
let did_you_mean = error_packages.iter()
|
||||
let did_you_mean = error_packages
|
||||
.iter()
|
||||
.flat_map(|(packages, _)| {
|
||||
packages.iter().filter_map(|f| {
|
||||
let from = url::Url::parse(&f.registry).ok()?.host_str()?.to_string();
|
||||
Some(format!(" {}@{} (from {from})", f.package, f.version))
|
||||
})
|
||||
}).collect::<Vec<_>>()
|
||||
})
|
||||
.collect::<Vec<_>>()
|
||||
.join("\r\n");
|
||||
|
||||
let (_, package_info) = url_of_package
|
||||
@@ -727,26 +751,27 @@ pub fn install_package(name: &str, version: Option<&str>) -> Result<PathBuf, Str
|
||||
.ok_or(format!("invalid url: {}", package_info.url))?
|
||||
.to_string();
|
||||
|
||||
let dir = get_package_local_dir(
|
||||
&host,
|
||||
&package_info.package,
|
||||
&package_info.version
|
||||
)?;
|
||||
let dir = get_package_local_dir(&host, &package_info.package, &package_info.version)?;
|
||||
|
||||
let version = package_info.version;
|
||||
let name = package_info.package;
|
||||
|
||||
let target_path = download_and_unpack_targz(&package_info.url, &dir)?;
|
||||
|
||||
let wapm_toml = std::fs::read_to_string(target_path.join("wapm.toml"))
|
||||
.map_err(|_| format!("Package {name}@{version} has no wapm.toml (path: {})", target_path.display()))?;
|
||||
let wapm_toml = std::fs::read_to_string(target_path.join("wapm.toml")).map_err(|_| {
|
||||
format!(
|
||||
"Package {name}@{version} has no wapm.toml (path: {})",
|
||||
target_path.display()
|
||||
)
|
||||
})?;
|
||||
|
||||
let wapm_toml = toml::from_str::<wapm_toml::Manifest>(&wapm_toml)
|
||||
.map_err(|e| format!("Could not parse toml for {name}@{version}: {e}"))?;
|
||||
|
||||
let commands = wapm_toml.command.unwrap_or_default();
|
||||
let entrypoint_module = commands.first()
|
||||
.ok_or(format!("Cannot run {name}@{version}: package has no commands"))?;
|
||||
let entrypoint_module = commands.first().ok_or(format!(
|
||||
"Cannot run {name}@{version}: package has no commands"
|
||||
))?;
|
||||
|
||||
let module_name = entrypoint_module.get_module();
|
||||
let modules = wapm_toml.module.unwrap_or_default();
|
||||
@@ -754,16 +779,17 @@ pub fn install_package(name: &str, version: Option<&str>) -> Result<PathBuf, Str
|
||||
.iter()
|
||||
.filter(|m| m.name == module_name)
|
||||
.next()
|
||||
.ok_or(format!("Cannot run {name}@{version}: module {module_name} not found in wapm.toml"))?;
|
||||
.ok_or(format!(
|
||||
"Cannot run {name}@{version}: module {module_name} not found in wapm.toml"
|
||||
))?;
|
||||
|
||||
Ok(target_path.join(&entrypoint_module.source))
|
||||
}
|
||||
|
||||
pub fn test_if_registry_present(registry: &str) -> Result<bool, String> {
|
||||
|
||||
use crate::graphql::{test_if_registry_present, TestIfRegistryPresent};
|
||||
use graphql_client::GraphQLQuery;
|
||||
use std::time::Duration;
|
||||
use crate::graphql::{TestIfRegistryPresent, test_if_registry_present};
|
||||
|
||||
let q = TestIfRegistryPresent::build_query(test_if_registry_present::Variables {});
|
||||
let _ = crate::graphql::execute_query_modifier_inner_check_json(
|
||||
@@ -771,8 +797,9 @@ pub fn test_if_registry_present(registry: &str) -> Result<bool, String> {
|
||||
"",
|
||||
&q,
|
||||
Some(Duration::from_secs(1)),
|
||||
|f| f
|
||||
).map_err(|e| format!("{e}"))?;
|
||||
|f| f,
|
||||
)
|
||||
.map_err(|e| format!("{e}"))?;
|
||||
|
||||
Ok(true)
|
||||
}
|
||||
@@ -783,7 +810,7 @@ pub fn get_all_available_registries() -> Result<Vec<String>, String> {
|
||||
match config.registry {
|
||||
Registries::Single(s) => {
|
||||
registries.push(format_graphql(&s.url));
|
||||
},
|
||||
}
|
||||
Registries::Multi(m) => {
|
||||
for key in m.tokens.keys() {
|
||||
registries.push(format_graphql(&key));
|
||||
|
||||
Reference in New Issue
Block a user