From 71c97e88eecdd2910241cc361f49dd25664190b0 Mon Sep 17 00:00:00 2001 From: Dmitry Marakasov Date: Sat, 28 Dec 2024 14:10:20 +0300 Subject: [PATCH] *: Switch to anyhow::Result (fixes #50) --- repology-vulnupdater/src/datetime.rs | 4 ++-- repology-vulnupdater/src/fetcher.rs | 8 +++---- repology-vulnupdater/src/main.rs | 4 ++-- repology-vulnupdater/src/processors.rs | 6 +++--- repology-vulnupdater/src/processors/cpe.rs | 6 +++--- repology-vulnupdater/src/processors/cve.rs | 6 +++--- repology-vulnupdater/src/status_tracker.rs | 14 +++++------- repology-vulnupdater/src/vulnupdater.rs | 15 ++++++------- repology-webapp/src/badges.rs | 4 ++-- repology-webapp/src/font.rs | 9 ++------ repology-webapp/src/lib.rs | 4 ++-- repology-webapp/src/main.rs | 6 +++--- repology-webapp/src/template_context.rs | 25 ++++++++-------------- repology-webapp/src/url_for.rs | 4 ++-- 14 files changed, 48 insertions(+), 67 deletions(-) diff --git a/repology-vulnupdater/src/datetime.rs b/repology-vulnupdater/src/datetime.rs index b6aee3b..ceceed0 100644 --- a/repology-vulnupdater/src/datetime.rs +++ b/repology-vulnupdater/src/datetime.rs @@ -1,10 +1,10 @@ // SPDX-FileCopyrightText: Copyright 2024 Dmitry Marakasov // SPDX-License-Identifier: GPL-3.0-or-later -use anyhow::Error; +use anyhow::Result; use chrono::{DateTime, NaiveDateTime, Utc}; -pub fn parse_utc_datetime(date: &str) -> Result, Error> { +pub fn parse_utc_datetime(date: &str) -> Result> { Ok(NaiveDateTime::parse_from_str(date, "%Y-%m-%dT%H:%M:%S%.3f")?.and_utc()) } diff --git a/repology-vulnupdater/src/fetcher.rs b/repology-vulnupdater/src/fetcher.rs index 2eb073c..0e7e734 100644 --- a/repology-vulnupdater/src/fetcher.rs +++ b/repology-vulnupdater/src/fetcher.rs @@ -4,7 +4,7 @@ use std::borrow::Cow; use std::time::{Duration, Instant}; -use anyhow::{Error, bail}; +use anyhow::{Result, bail}; use chrono::{TimeDelta, Utc}; use metrics::counter; use serde::Deserialize; @@ -31,7 +31,7 @@ pub struct NvdFetcher { } impl NvdFetcher { - pub fn new() -> Result { + pub fn new() -> Result { let inner = Inner { client: reqwest::Client::builder() .user_agent(USER_AGENT) @@ -45,7 +45,7 @@ impl NvdFetcher { }) } - async fn fetch(&self, url: &str) -> Result { + async fn fetch(&self, url: &str) -> Result { let mut inner = self.inner.lock().await; if let Some(elapsed) = inner.last_request_time.map(|instant| instant.elapsed()) { @@ -104,7 +104,7 @@ impl<'a> Paginator<'a> { } } - pub async fn fetch_next(&mut self) -> Result, Error> { + pub async fn fetch_next(&mut self) -> Result> { if let Some(total_results) = self.total_results { if self.start_index >= total_results { return Ok(None); diff --git a/repology-vulnupdater/src/main.rs b/repology-vulnupdater/src/main.rs index d039579..83a12d5 100644 --- a/repology-vulnupdater/src/main.rs +++ b/repology-vulnupdater/src/main.rs @@ -15,7 +15,7 @@ mod vulnupdater; use std::cell::LazyCell; -use anyhow::{Context, Error, bail}; +use anyhow::{Context, Result, bail}; use clap::Parser as _; use sqlx::Executor; use sqlx::postgres::PgPoolOptions; @@ -30,7 +30,7 @@ use status_tracker::SourceUpdateStatusTracker; use vulnupdater::{Datasource, VulnUpdater}; #[tokio::main] -async fn main() -> Result<(), Error> { +async fn main() -> Result<()> { let args = Args::parse(); if let Some(log_directory) = &args.log_directory { diff --git a/repology-vulnupdater/src/processors.rs b/repology-vulnupdater/src/processors.rs index 36fb748..8c36063 100644 --- a/repology-vulnupdater/src/processors.rs +++ b/repology-vulnupdater/src/processors.rs @@ -4,7 +4,7 @@ pub mod cpe; pub mod cve; -use anyhow::Error; +use anyhow::Result; use async_trait::async_trait; pub struct DatasourceProcessStatus { @@ -13,6 +13,6 @@ pub struct DatasourceProcessStatus { #[async_trait] pub trait DatasourceProcessor { - async fn process(&self, data: &str) -> Result; - async fn finalize(&self) -> Result<(), Error>; + async fn process(&self, data: &str) -> Result; + async fn finalize(&self) -> Result<()>; } diff --git a/repology-vulnupdater/src/processors/cpe.rs b/repology-vulnupdater/src/processors/cpe.rs index 9d2f471..adda0a2 100644 --- a/repology-vulnupdater/src/processors/cpe.rs +++ b/repology-vulnupdater/src/processors/cpe.rs @@ -5,7 +5,7 @@ mod schema; use std::str::FromStr as _; -use anyhow::Error; +use anyhow::Result; use async_trait::async_trait; use indoc::indoc; use metrics::counter; @@ -52,7 +52,7 @@ impl<'a> CpeProcessor<'a> { #[async_trait] impl DatasourceProcessor for CpeProcessor<'_> { - async fn process(&self, data: &str) -> Result { + async fn process(&self, data: &str) -> Result { counter!("repology_vulnupdater_processor_runs_total", "processor" => "cpe", "stage" => "processing").increment(1); counter!("repology_vulnupdater_processor_data_bytes_total", "processor" => "cpe") .increment(data.len() as u64); @@ -174,7 +174,7 @@ impl DatasourceProcessor for CpeProcessor<'_> { }) } - async fn finalize(&self) -> Result<(), Error> { + async fn finalize(&self) -> Result<()> { if self.skip_finalization { return Ok(()); } diff --git a/repology-vulnupdater/src/processors/cve.rs b/repology-vulnupdater/src/processors/cve.rs index 623491e..7936d9b 100644 --- a/repology-vulnupdater/src/processors/cve.rs +++ b/repology-vulnupdater/src/processors/cve.rs @@ -4,7 +4,7 @@ mod cpe_matches; mod schema; -use anyhow::Error; +use anyhow::Result; use async_trait::async_trait; use indoc::indoc; use metrics::counter; @@ -36,7 +36,7 @@ impl<'a> CveProcessor<'a> { #[async_trait] impl DatasourceProcessor for CveProcessor<'_> { - async fn process(&self, data: &str) -> Result { + async fn process(&self, data: &str) -> Result { counter!("repology_vulnupdater_processor_runs_total", "processor" => "cve", "stage" => "processing").increment(1); counter!("repology_vulnupdater_processor_data_bytes_total", "processor" => "cve") .increment(data.len() as u64); @@ -124,7 +124,7 @@ impl DatasourceProcessor for CveProcessor<'_> { Ok(DatasourceProcessStatus { num_changes }) } - async fn finalize(&self) -> Result<(), Error> { + async fn finalize(&self) -> Result<()> { if self.skip_finalization { return Ok(()); } diff --git a/repology-vulnupdater/src/status_tracker.rs b/repology-vulnupdater/src/status_tracker.rs index 6c71911..8c1ba58 100644 --- a/repology-vulnupdater/src/status_tracker.rs +++ b/repology-vulnupdater/src/status_tracker.rs @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: Copyright 2024 Dmitry Marakasov // SPDX-License-Identifier: GPL-3.0-or-later -use anyhow::Error; +use anyhow::Result; use chrono::{DateTime, Utc}; use indoc::indoc; use sqlx::{FromRow, PgPool}; @@ -23,7 +23,7 @@ impl<'a> SourceUpdateStatusTracker<'a> { Self { pool } } - pub async fn get(&self, name: &str) -> Result { + pub async fn get(&self, name: &str) -> Result { Ok(sqlx::query_as(indoc! {" SELECT current_full_update_offset, last_full_update_time, last_update_time FROM update_status @@ -35,11 +35,7 @@ impl<'a> SourceUpdateStatusTracker<'a> { .unwrap_or_default()) } - pub async fn register_update_attempt( - &self, - name: &str, - time: DateTime, - ) -> Result<(), Error> { + pub async fn register_update_attempt(&self, name: &str, time: DateTime) -> Result<()> { sqlx::query(indoc! {" INSERT INTO update_status(name, last_update_attempt_time) VALUES ($1, $2) @@ -52,7 +48,7 @@ impl<'a> SourceUpdateStatusTracker<'a> { Ok(()) } - pub async fn register_successful_update(&self, name: &str, is_full: bool) -> Result<(), Error> { + pub async fn register_successful_update(&self, name: &str, is_full: bool) -> Result<()> { sqlx::query(indoc! {" UPDATE update_status SET @@ -72,7 +68,7 @@ impl<'a> SourceUpdateStatusTracker<'a> { &self, name: &str, current_offset: u64, - ) -> Result<(), Error> { + ) -> Result<()> { sqlx::query(indoc! {" UPDATE update_status SET current_full_update_offset = $2 diff --git a/repology-vulnupdater/src/vulnupdater.rs b/repology-vulnupdater/src/vulnupdater.rs index 9a53ef7..565518d 100644 --- a/repology-vulnupdater/src/vulnupdater.rs +++ b/repology-vulnupdater/src/vulnupdater.rs @@ -3,7 +3,7 @@ use std::time::Duration; -use anyhow::Error; +use anyhow::Result; use chrono::{DateTime, TimeDelta, Utc}; use metrics::{counter, gauge}; use tracing::{info, instrument, warn}; @@ -43,7 +43,7 @@ impl<'a> VulnUpdater<'a> { &self, datasource: &Datasource<'a>, now: DateTime, - ) -> Result { + ) -> Result { let pager = self.fetcher.paginate(datasource.url); self.status_tracker .register_update_attempt(datasource.name, now) @@ -55,7 +55,7 @@ impl<'a> VulnUpdater<'a> { &self, datasource: &Datasource<'a>, offset: u64, - ) -> Result { + ) -> Result { let mut pager = self.fetcher.paginate(datasource.url); pager.seek(offset); Ok(pager) @@ -66,7 +66,7 @@ impl<'a> VulnUpdater<'a> { datasource: &Datasource<'a>, now: DateTime, since: DateTime, - ) -> Result { + ) -> Result { let start_date = (since - INCREMENTAL_UPDATE_OVERLAP).min(now - INCREMENTAL_UPDATE_OVERLAP); let end_date = now + INCREMENTAL_UPDATE_OVERLAP; if (end_date - start_date) > MAX_INCREMENTAL_UPDATE_SPAN { @@ -95,7 +95,7 @@ impl<'a> VulnUpdater<'a> { &self, datasource: &Datasource<'a>, update_period: Option, - ) -> Result>, Error> { + ) -> Result>> { let source_status = self.status_tracker.get(datasource.name).await?; let now = Utc::now(); @@ -166,10 +166,7 @@ impl<'a> VulnUpdater<'a> { } #[instrument("oneshot", skip_all)] - pub async fn process_datasources_once( - &self, - datasources: &[Datasource<'a>], - ) -> Result<(), Error> { + pub async fn process_datasources_once(&self, datasources: &[Datasource<'a>]) -> Result<()> { for datasource in datasources { self.update_datasource(datasource, None).await?; } diff --git a/repology-webapp/src/badges.rs b/repology-webapp/src/badges.rs index d45321b..1b11f00 100644 --- a/repology-webapp/src/badges.rs +++ b/repology-webapp/src/badges.rs @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: Copyright 2024 Dmitry Marakasov // SPDX-License-Identifier: GPL-3.0-or-later -use anyhow::Error; +use anyhow::Result; use repology_common::PackageStatus; @@ -106,7 +106,7 @@ pub fn render_generic_badge( header: Option<&str>, min_width: usize, font_measurer: &FontMeasurer, -) -> Result { +) -> Result { let num_rows = cells.len(); let num_columns = if num_rows > 0 { cells[0].len() } else { 0 }; diff --git a/repology-webapp/src/font.rs b/repology-webapp/src/font.rs index 9c5da17..a182f87 100644 --- a/repology-webapp/src/font.rs +++ b/repology-webapp/src/font.rs @@ -3,7 +3,7 @@ use std::path::Path; -use anyhow::Error; +use anyhow::Result; use tracing::{error, info}; #[allow(unused)] @@ -55,12 +55,7 @@ impl FontMeasurer { } } - pub fn get_text_width( - &self, - text: &str, - size: usize, - style: FontStyle, - ) -> Result { + pub fn get_text_width(&self, text: &str, size: usize, style: FontStyle) -> Result { // as ttf_parser documentation say, Face::parse is really fast so there's no // need to store it in Font let face = ttf_parser::Face::parse( diff --git a/repology-webapp/src/lib.rs b/repology-webapp/src/lib.rs index 3c957b5..8614662 100644 --- a/repology-webapp/src/lib.rs +++ b/repology-webapp/src/lib.rs @@ -30,7 +30,7 @@ mod xmlwriter; use std::sync::Arc; use std::time::Instant; -use anyhow::{Context, Error}; +use anyhow::{Context, Result}; use axum::{ Router, body::HttpBody, @@ -90,7 +90,7 @@ async fn track_metrics(matched_path: MatchedPath, req: Request, next: Next) -> i not(feature = "coverage"), tracing::instrument(name = "app init", skip_all) )] -pub async fn create_app(pool: PgPool) -> Result { +pub async fn create_app(pool: PgPool) -> Result { info!("initializing font measurer"); let font_measurer = FontMeasurer::new(); diff --git a/repology-webapp/src/main.rs b/repology-webapp/src/main.rs index c4c1043..8750e99 100644 --- a/repology-webapp/src/main.rs +++ b/repology-webapp/src/main.rs @@ -3,7 +3,7 @@ mod config; -use anyhow::{Context, Error}; +use anyhow::{Context, Result}; use clap::Parser; use metrics::{counter, gauge}; use sqlx::Executor; @@ -64,7 +64,7 @@ fn collect_tokio_runtime_metrics() { } } -async fn async_main() -> Result<(), Error> { +async fn async_main() -> Result<()> { let config = Config::parse(); if let Some(log_directory) = &config.log_directory { @@ -143,7 +143,7 @@ async fn async_main() -> Result<(), Error> { .context("error starting HTTP server") } -fn main() -> Result<(), Error> { +fn main() -> Result<()> { tokio::runtime::Builder::new_multi_thread() .enable_all() .build() diff --git a/repology-webapp/src/template_context.rs b/repology-webapp/src/template_context.rs index 071d49a..2e07984 100644 --- a/repology-webapp/src/template_context.rs +++ b/repology-webapp/src/template_context.rs @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: Copyright 2024 Dmitry Marakasov // SPDX-License-Identifier: GPL-3.0-or-later -use anyhow::{Error, anyhow}; +use anyhow::{Result, anyhow}; use crate::endpoints::{Endpoint, Section}; use crate::static_files::STATIC_FILES; @@ -31,7 +31,7 @@ impl TemplateContext { } } - pub fn url_for_static(&self, file_name: &str) -> Result { + pub fn url_for_static(&self, file_name: &str) -> Result { let file = STATIC_FILES .by_orig_name(file_name) .ok_or_else(|| anyhow!("unknown static file \"{}\"", file_name))?; @@ -41,27 +41,23 @@ impl TemplateContext { .construct() } - pub fn url_for_unversioned_static(&self, file_name: &str) -> Result { + pub fn url_for_unversioned_static(&self, file_name: &str) -> Result { UrlConstructor::new(Endpoint::StaticFile.path()) .with_field("file_name", file_name) .construct() } #[expect(dead_code)] - pub fn external_url_for_static(&self, file_name: &str) -> Result { + pub fn external_url_for_static(&self, file_name: &str) -> Result { Ok(crate::constants::REPOLOGY_HOSTNAME.to_string() + &self.url_for_static(file_name)?) } - pub fn external_url_for_unversioned_static(&self, file_name: &str) -> Result { + pub fn external_url_for_unversioned_static(&self, file_name: &str) -> Result { Ok(crate::constants::REPOLOGY_HOSTNAME.to_string() + &self.url_for_unversioned_static(file_name)?) } - pub fn url_for<'a>( - &self, - endpoint: Endpoint, - fields: &[(&'a str, &'a str)], - ) -> Result { + pub fn url_for<'a>(&self, endpoint: Endpoint, fields: &[(&'a str, &'a str)]) -> Result { UrlConstructor::new(endpoint.path()) .with_fields(fields.iter().cloned()) .construct() @@ -71,21 +67,18 @@ impl TemplateContext { &self, endpoint: Endpoint, fields: &[(&'a str, &'a str)], - ) -> Result { + ) -> Result { Ok(crate::constants::REPOLOGY_HOSTNAME.to_string() + &self.url_for(endpoint, fields)?) } - pub fn url_for_self<'a>(&self, fields: &[(&'a str, &'a str)]) -> Result { + pub fn url_for_self<'a>(&self, fields: &[(&'a str, &'a str)]) -> Result { UrlConstructor::new(self.endpoint.path()) .with_fields(self.params.iter().map(|(k, v)| (k.as_ref(), v.as_ref()))) .with_fields(fields.iter().cloned()) .construct() } - pub fn external_url_for_self<'a>( - &self, - fields: &[(&'a str, &'a str)], - ) -> Result { + pub fn external_url_for_self<'a>(&self, fields: &[(&'a str, &'a str)]) -> Result { Ok(crate::constants::REPOLOGY_HOSTNAME.to_string() + &self.url_for_self(fields)?) } diff --git a/repology-webapp/src/url_for.rs b/repology-webapp/src/url_for.rs index 365e994..ebbf8ac 100644 --- a/repology-webapp/src/url_for.rs +++ b/repology-webapp/src/url_for.rs @@ -3,7 +3,7 @@ use indexmap::IndexMap; -use anyhow::{Error, bail}; +use anyhow::{Result, bail}; pub struct UrlConstructor<'a> { pattern: &'static str, @@ -18,7 +18,7 @@ impl<'a> UrlConstructor<'a> { } } - pub fn construct(&self) -> Result { + pub fn construct(&self) -> Result { let mut fields = self.fields.clone(); let mut res = String::new();