summaryrefslogtreecommitdiffstats
path: root/src/version.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/version.rs')
-rw-r--r--src/version.rs55
1 files changed, 12 insertions, 43 deletions
diff --git a/src/version.rs b/src/version.rs
index 462ba3b..b844f23 100644
--- a/src/version.rs
+++ b/src/version.rs
@@ -214,7 +214,7 @@ pub struct Library {
impl Library {
pub fn get_canonical_name(&self) -> String {
- canonicalize_library_name(self.name.as_str())
+ canonicalize_library_name(self.name.as_str(), self.natives.as_ref().map_or(None, |_| Some("__ozone_natives")))
}
}
@@ -258,8 +258,8 @@ pub struct CompleteVersion {
#[serde(default)]
pub downloads: BTreeMap<DownloadType, DownloadInfo>,
- #[serde(default, deserialize_with = "deserialize_libraries")]
- pub libraries: IndexMap<String, Library>,
+ #[serde(default)]
+ pub libraries: Vec<Library>,
pub id: String,
pub jar: Option<String>, // used as the jar filename if specified? (no longer used officially)
@@ -321,9 +321,7 @@ impl CompleteVersion {
self.downloads.entry(*dltype).or_insert_with(|| dl.clone());
}
- for (name, lib) in other.libraries.iter().by_ref() {
- self.libraries.entry(name.to_owned()).or_insert_with(|| lib.clone());
- }
+ self.libraries.splice(0..0, other.libraries.iter().cloned());
replace_missing!(logging);
replace_missing!(main_class);
@@ -344,11 +342,12 @@ impl CompleteVersion {
}
}
-fn canonicalize_library_name(name: &str) -> String {
+fn canonicalize_library_name(name: &str, suffix: Option<&str>) -> String {
name.split(':')
.enumerate()
.filter(|(i, _)| *i != 2)
.map(|(_, s)| s.to_ascii_lowercase())
+ .chain(suffix.into_iter().map(|s| s.to_owned()))
.collect::<Vec<_>>()
.join(":")
}
@@ -387,37 +386,6 @@ where
deserializer.deserialize_str(DateTimeVisitor)
}
-fn deserialize_libraries<'de, D>(deserializer: D) -> Result<IndexMap<String, Library>, D::Error>
-where
- D: Deserializer<'de>
-{
- struct LibrariesVisitor;
-
- impl<'de> Visitor<'de> for LibrariesVisitor {
- type Value = IndexMap<String, Library>;
-
- fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
- formatter.write_str("an array of libraries")
- }
-
- fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
- where
- A: SeqAccess<'de>,
- {
- let mut map = IndexMap::new();
-
- while let Some(lib) = seq.next_element::<Library>()? {
- //map.insert(canonicalize_library_name(lib.name.as_str()), lib);
- map.insert(lib.name.as_str().to_owned(), lib);
- }
-
- Ok(map)
- }
- }
-
- deserializer.deserialize_seq(LibrariesVisitor)
-}
-
// https://serde.rs/string-or-struct.html
fn string_or_struct<'de, T, D>(deserializer: D) -> Result<T, D::Error>
where
@@ -511,10 +479,11 @@ mod tests {
#[test]
fn test_it3() {
- assert_eq!(canonicalize_library_name("group:artifact:version"), String::from("group:artifact"));
- assert_eq!(canonicalize_library_name("group:artifact:version:specifier"), String::from("group:artifact:specifier"));
- assert_eq!(canonicalize_library_name("not_enough:fields"), String::from("not_enough:fields"));
- assert_eq!(canonicalize_library_name("word"), String::from("word"));
- assert_eq!(canonicalize_library_name(""), String::from(""));
+ assert_eq!(canonicalize_library_name("group:artifact:version", None), String::from("group:artifact"));
+ assert_eq!(canonicalize_library_name("group:artifact:version:specifier", None), String::from("group:artifact:specifier"));
+ assert_eq!(canonicalize_library_name("not_enough:fields", None), String::from("not_enough:fields"));
+ assert_eq!(canonicalize_library_name("word", None), String::from("word"));
+ assert_eq!(canonicalize_library_name("", None), String::from(""));
+ assert_eq!(canonicalize_library_name("group:artifact:version", Some("suffix")), String::from("group:artifact:suffix"));
}
}