mirror of
https://codeberg.org/icewind/rss-webhook-trigger.git
synced 2026-06-03 18:04:09 +02:00
add builtin docker-hub support
This commit is contained in:
parent
3ad2f34e22
commit
334806c5b7
5 changed files with 90 additions and 0 deletions
42
src/hub.rs
Normal file
42
src/hub.rs
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
use color_eyre::eyre::WrapErr;
|
||||
use color_eyre::{eyre::ensure, Result};
|
||||
use reqwest::Client;
|
||||
use serde::Deserialize;
|
||||
use time::OffsetDateTime;
|
||||
|
||||
pub async fn tags(client: &Client, user: &str, repo: &str) -> Result<Vec<HubTag>> {
|
||||
let result = client
|
||||
.get(format!(
|
||||
"https://hub.docker.com/v2/repositories/{}/{}/tags",
|
||||
user, repo
|
||||
))
|
||||
.send()
|
||||
.await
|
||||
.wrap_err("error with sending docker hub request")?;
|
||||
ensure!(
|
||||
!result.status().is_client_error(),
|
||||
"error with sending docker hub request"
|
||||
);
|
||||
ensure!(
|
||||
!result.status().is_server_error(),
|
||||
"docker hub request returned an error"
|
||||
);
|
||||
Ok(result
|
||||
.json::<HubTagResponse>()
|
||||
.await
|
||||
.wrap_err("failed to parse hub response")?
|
||||
.results)
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize)]
|
||||
pub struct HubTagResponse {
|
||||
results: Vec<HubTag>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize)]
|
||||
pub struct HubTag {
|
||||
pub id: u64,
|
||||
#[serde(with = "time::serde::rfc3339")]
|
||||
pub last_updated: OffsetDateTime,
|
||||
pub name: String,
|
||||
}
|
||||
20
src/main.rs
20
src/main.rs
|
|
@ -1,4 +1,5 @@
|
|||
mod config;
|
||||
mod hub;
|
||||
|
||||
use crate::config::{Config, FeedConfig};
|
||||
use color_eyre::{
|
||||
|
|
@ -107,6 +108,25 @@ impl FeedFetcher {
|
|||
}
|
||||
|
||||
async fn get_feed_key(&self, feed: &str) -> Result<u64> {
|
||||
if let Some(hub) = feed.strip_prefix("docker-hub://") {
|
||||
if let Some((user, repo)) = hub.split_once('/') {
|
||||
let tags = hub::tags(&self.client, user, repo).await?;
|
||||
let mut hasher = DefaultHasher::new();
|
||||
for tag in tags {
|
||||
tag.id.hash(&mut hasher);
|
||||
tag.last_updated.hash(&mut hasher);
|
||||
}
|
||||
|
||||
Ok(hasher.finish())
|
||||
} else {
|
||||
return Err(eyre!("Invalid hub format {}", feed))
|
||||
}
|
||||
} else {
|
||||
self.get_rss_feed_key(feed).await
|
||||
}
|
||||
}
|
||||
|
||||
async fn get_rss_feed_key(&self, feed: &str) -> Result<u64> {
|
||||
let content = self
|
||||
.client
|
||||
.get(feed)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue