diff --git a/rocks-bin/src/download.rs b/rocks-bin/src/download.rs index 75b34388..e2cdf6a3 100644 --- a/rocks-bin/src/download.rs +++ b/rocks-bin/src/download.rs @@ -1,10 +1,10 @@ use clap::Args; use eyre::Result; -use rocks_lib::config::Config; +use rocks_lib::{config::Config, lua_package::PackageName}; #[derive(Args)] pub struct Download { - name: String, + name: PackageName, version: Option, } diff --git a/rocks-bin/src/install.rs b/rocks-bin/src/install.rs index a0ca0e90..c994fcc3 100644 --- a/rocks-bin/src/install.rs +++ b/rocks-bin/src/install.rs @@ -1,10 +1,10 @@ use eyre::Result; -use rocks_lib::config::Config; +use rocks_lib::{config::Config, lua_package::PackageName}; #[derive(clap::Args)] pub struct Install { /// Name of the rock to install. - name: String, + name: PackageName, /// Rocks version to install. version: Option, } diff --git a/rocks-bin/src/search.rs b/rocks-bin/src/search.rs index 03aa37a0..769ab2c2 100644 --- a/rocks-bin/src/search.rs +++ b/rocks-bin/src/search.rs @@ -7,13 +7,14 @@ use text_trees::{FormatCharacters, StringTreeNode, TreeFormatting}; use rocks_lib::{ config::Config, + lua_package::PackageName, manifest::{manifest_from_server, ManifestMetadata}, }; #[derive(Args)] pub struct Search { /// Name of the rock to search for. - name: String, + name: PackageName, /// Rocks version to search for. version: Option, // TODO(vhyrro): Add options. @@ -29,11 +30,11 @@ pub async fn search(data: Search, config: &Config) -> Result<()> { let metadata = ManifestMetadata::new(&manifest)?; - let rock_to_version_map: HashMap<&String, Vec<&String>> = metadata + let rock_to_version_map: HashMap<&PackageName, Vec<&String>> = metadata .repository .iter() .filter_map(|(key, value)| { - if key.contains(&data.name) { + if key.to_string().contains(&data.name.to_string()) { Some(( key, value.keys().sorted_by(|a, b| Ord::cmp(b, a)).collect_vec(), @@ -48,7 +49,7 @@ pub async fn search(data: Search, config: &Config) -> Result<()> { println!("{}", serde_json::to_string(&rock_to_version_map)?); } else { for (key, versions) in rock_to_version_map.into_iter().sorted() { - let mut tree = StringTreeNode::new(key.to_owned()); + let mut tree = StringTreeNode::new(key.to_string().to_owned()); for version in versions { tree.push(version.to_owned()); diff --git a/rocks-bin/src/unpack.rs b/rocks-bin/src/unpack.rs index ae452c06..8ba19d54 100644 --- a/rocks-bin/src/unpack.rs +++ b/rocks-bin/src/unpack.rs @@ -2,7 +2,7 @@ use std::path::PathBuf; use clap::Args; use eyre::Result; -use rocks_lib::config::Config; +use rocks_lib::{config::Config, lua_package::PackageName}; #[derive(Args)] pub struct Unpack { @@ -15,7 +15,7 @@ pub struct Unpack { #[derive(Args)] pub struct UnpackRemote { /// The name of the rock to unpack - name: String, + name: PackageName, /// The version of the rock to download (defaults to latest version) version: Option, /// The directory to unpack to diff --git a/rocks-lib/src/lua_package/mod.rs b/rocks-lib/src/lua_package/mod.rs index e6feaa44..4961eb90 100644 --- a/rocks-lib/src/lua_package/mod.rs +++ b/rocks-lib/src/lua_package/mod.rs @@ -1,6 +1,6 @@ use eyre::Result; use semver::Version; -use serde::Deserialize; +use serde::{Deserialize, Serialize}; use std::fmt::Display; mod version; @@ -29,7 +29,7 @@ impl LuaPackage { } /// A luarocks package name, which is always lowercase -#[derive(Deserialize, Debug, PartialEq, Eq, Clone)] +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Hash)] pub struct PackageName { name: String, } @@ -43,6 +43,24 @@ impl PackageName { } } +impl<'de> Deserialize<'de> for PackageName { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + Ok(PackageName::new(String::deserialize(deserializer)?)) + } +} + +impl Serialize for PackageName { + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + self.name.serialize(serializer) + } +} + impl From<&str> for PackageName { fn from(value: &str) -> Self { Self::new(value.into()) diff --git a/rocks-lib/src/manifest/metadata.rs b/rocks-lib/src/manifest/metadata.rs index 0fbe16e0..be238c22 100644 --- a/rocks-lib/src/manifest/metadata.rs +++ b/rocks-lib/src/manifest/metadata.rs @@ -3,11 +3,18 @@ use itertools::Itertools; use mlua::{Lua, LuaSerdeExt}; use std::collections::HashMap; -use crate::config::Config; +use crate::{config::Config, lua_package::PackageName}; #[derive(serde::Deserialize)] pub struct ManifestMetadata { - pub repository: HashMap>>>, + /// The key of each package's HashMap is the version string + pub repository: HashMap>>, +} + +#[derive(serde::Deserialize)] +pub struct ManifestRockEntry { + /// e.g. "linux-x86_64", "rockspec", "src", ... + pub arch: String, } impl ManifestMetadata { @@ -31,11 +38,11 @@ impl ManifestMetadata { Self::new(&manifest) } - pub fn has_rock(&self, rock_name: &String) -> bool { + pub fn has_rock(&self, rock_name: &PackageName) -> bool { self.repository.contains_key(rock_name) } - pub fn available_versions(&self, rock_name: &String) -> Option> { + pub fn available_versions(&self, rock_name: &PackageName) -> Option> { if !self.has_rock(rock_name) { return None; } @@ -43,7 +50,7 @@ impl ManifestMetadata { Some(self.repository[rock_name].keys().collect()) } - pub fn latest_version(&self, rock_name: &String) -> Option<&String> { + pub fn latest_version(&self, rock_name: &PackageName) -> Option<&String> { if !self.has_rock(rock_name) { return None; } diff --git a/rocks-lib/src/operations/download.rs b/rocks-lib/src/operations/download.rs index 013de5d7..2a39b4cb 100644 --- a/rocks-lib/src/operations/download.rs +++ b/rocks-lib/src/operations/download.rs @@ -2,16 +2,16 @@ use std::path::PathBuf; use eyre::{eyre, Result}; -use crate::config::Config; +use crate::{config::Config, lua_package::PackageName}; pub struct DownloadedRock { - pub name: String, + pub name: PackageName, pub version: String, pub path: PathBuf, } pub async fn download( - rock_name: &String, + rock_name: &PackageName, rock_version: Option<&String>, destination_dir: Option, config: &Config, diff --git a/rocks-lib/src/operations/install.rs b/rocks-lib/src/operations/install.rs index f51cad87..e1095fb9 100644 --- a/rocks-lib/src/operations/install.rs +++ b/rocks-lib/src/operations/install.rs @@ -1,14 +1,14 @@ use eyre::Result; use tempdir::TempDir; -use crate::{config::Config, rockspec::Rockspec}; +use crate::{config::Config, lua_package::PackageName, rockspec::Rockspec}; pub async fn install( - rock_name: String, + rock_name: PackageName, rock_version: Option, config: &Config, ) -> Result<()> { - let temp = TempDir::new(&rock_name)?; + let temp = TempDir::new(&rock_name.to_string())?; let rock = super::download( &rock_name,