Skip to content

Commit 2ff31b3

Browse files
committed
test and update quick_xml update bucket deserialization
1 parent 9e081d6 commit 2ff31b3

File tree

3 files changed

+38
-10
lines changed

3 files changed

+38
-10
lines changed

Cargo.lock

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ url = "2"
4646
serde_repr = "0.1"
4747
webpki-roots = "0.26"
4848
ar = "0.9"
49-
quick-xml = { version = "0.31", features = ["serialize"] }
49+
quick-xml = { version = "0.36", features = ["serialize"] }
5050
semver = "1"
5151
futures-util = "0.3"
5252
self-replace = "1"

src/update.rs

+35-7
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ async fn latest_release(client: &Client) -> Result<Release, UpdateError> {
7575
.contents
7676
.into_iter()
7777
.flat_map(Content::release)
78-
.max()
78+
.filter(|release| release.key.contains(effective_target()))
79+
.max_by_key(|release| release.version.clone())
7980
.ok_or(UpdateError::NoReleases)
8081
}
8182

@@ -93,18 +94,15 @@ struct ListBucket {
9394
contents: Vec<Content>,
9495
}
9596

96-
#[derive(Debug, Deserialize)]
97+
#[derive(Debug, Clone, Deserialize)]
9798
#[serde(rename_all = "PascalCase")]
9899
struct Content {
99100
key: String,
100101
}
101102

102103
impl Content {
103104
fn release(self) -> Option<Release> {
104-
let (version, filename) = self.key.split_once('/')?;
105-
if !filename.contains(effective_target()) {
106-
return None;
107-
}
105+
let (version, _filename) = self.key.split_once('/')?;
108106
let version = version.strip_prefix('v')?;
109107
Some(Release {
110108
version: version.parse().ok()?,
@@ -113,7 +111,7 @@ impl Content {
113111
}
114112
}
115113

116-
#[derive(Debug, Ord, PartialOrd, Eq, PartialEq)]
114+
#[derive(Debug, Clone)]
117115
struct Release {
118116
version: Version,
119117
key: String,
@@ -170,3 +168,33 @@ impl From<Elapsed> for UpdateError {
170168
UpdateError::Timeout
171169
}
172170
}
171+
172+
#[cfg(test)]
173+
mod tests {
174+
use super::*;
175+
176+
#[test]
177+
fn test_list_bucket() {
178+
let sample = r#"
179+
<?xml version="1.0" encoding="UTF-8"?>
180+
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
181+
<Name>fishnet-releases</Name>
182+
<Prefix/>
183+
<KeyCount>74</KeyCount>
184+
<MaxKeys>1000</MaxKeys>
185+
<IsTruncated>false</IsTruncated>
186+
<Contents>
187+
<Key>v2.6.10/fishnet-v2.6.10-aarch64-apple-darwin</Key>
188+
<LastModified>2023-05-01T16:27:52.000Z</LastModified>
189+
<ETag>"f7ed5e695e421adbf153ee35a4d46fca-6"</ETag>
190+
<Size>30471464</Size>
191+
<StorageClass>STANDARD</StorageClass>
192+
</Contents>
193+
</ListBucketResult>"#;
194+
195+
let bucket: ListBucket = quick_xml::de::from_str(sample).unwrap();
196+
let release = bucket.contents[0].clone().release().unwrap();
197+
assert_eq!(release.version, Version::new(2, 6, 10));
198+
assert_eq!(release.key, "v2.6.10/fishnet-v2.6.10-aarch64-apple-darwin");
199+
}
200+
}

0 commit comments

Comments
 (0)