]> Untitled Git - lemmy.git/commitdiff
Migrate from failure to anyhow and thiserror (#1042)
authorandor0 <aaorlov1@gmail.com>
Sat, 1 Aug 2020 14:04:42 +0000 (18:04 +0400)
committerGitHub <noreply@github.com>
Sat, 1 Aug 2020 14:04:42 +0000 (14:04 +0000)
* Migrate from failure to anyhow and thiserror

* Replace 'format_err!' to 'anyhow!'

13 files changed:
server/Cargo.lock
server/Cargo.toml
server/src/api/mod.rs
server/src/apub/extensions/signatures.rs
server/src/apub/fetcher.rs
server/src/apub/inbox/activities/undo.rs
server/src/apub/inbox/community_inbox.rs
server/src/apub/mod.rs
server/src/lib.rs
server/src/request.rs
server/src/routes/feeds.rs
server/src/routes/nodeinfo.rs
server/src/routes/webfinger.rs

index 3f19827be26a764016c49a9bad10d64f3aea5faa..891828943910c1e8717a214f99fd699bebb1eaca 100644 (file)
@@ -406,6 +406,12 @@ dependencies = [
  "winapi 0.3.9",
 ]
 
+[[package]]
+name = "anyhow"
+version = "1.0.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6b602bfe940d21c130f3895acd65221e8a61270debe89d628b9cb4e3ccb8569b"
+
 [[package]]
 name = "arc-swap"
 version = "0.4.7"
@@ -1194,28 +1200,6 @@ dependencies = [
  "termcolor",
 ]
 
-[[package]]
-name = "failure"
-version = "0.1.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86"
-dependencies = [
- "backtrace",
- "failure_derive",
-]
-
-[[package]]
-name = "failure_derive"
-version = "0.1.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
- "synstructure",
-]
-
 [[package]]
 name = "fake-simd"
 version = "0.1.2"
@@ -1733,6 +1717,7 @@ dependencies = [
  "actix-rt",
  "actix-web",
  "actix-web-actors",
+ "anyhow",
  "async-trait",
  "awc",
  "base64 0.12.3",
@@ -1743,7 +1728,6 @@ dependencies = [
  "diesel_migrations",
  "dotenv",
  "env_logger",
- "failure",
  "futures",
  "http",
  "http-signature-normalization-actix",
@@ -1762,6 +1746,7 @@ dependencies = [
  "sha2",
  "strum",
  "strum_macros",
+ "thiserror",
  "tokio",
  "url",
  "uuid 0.8.1",
@@ -3116,18 +3101,6 @@ dependencies = [
  "unicode-xid",
 ]
 
-[[package]]
-name = "synstructure"
-version = "0.12.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b834f2d66f734cb897113e34aaff2f1ab4719ca946f9a7358dba8f8064148701"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
- "unicode-xid",
-]
-
 [[package]]
 name = "tempfile"
 version = "3.1.0"
index 3a652f2985d46c88f51bece32e23bb7eb8bc5260..2971002a9002b141b48f98fd0e9a39f49987069b 100644 (file)
@@ -23,7 +23,6 @@ activitystreams-ext = { git = "https://yerbamate.dev/asonix/activitystreams-ext"
 bcrypt = "0.8.0"
 chrono = { version = "0.4.7", features = ["serde"] }
 serde_json = { version = "1.0.52", features = ["preserve_order"]}
-failure = "0.1.8"
 serde = { version = "1.0.105", features = ["derive"] }
 actix = "0.10.0-alpha.2"
 actix-web = { version = "3.0.0-alpha.3", features = ["rustls"] }
@@ -52,3 +51,5 @@ uuid = { version = "0.8", features = ["serde", "v4"] }
 sha2 = "0.9"
 async-trait = "0.1.36"
 captcha = "0.0.7"
+anyhow = "1.0.32"
+thiserror = "1.0.20"
index 90117260136878cc5a987e03a7e4d9fe20f09ba6..11f958f087d6c92982e94ad1855ea1fd18c4b84c 100644 (file)
@@ -9,6 +9,7 @@ use lemmy_db::{
   user_view::*,
   Crud,
 };
+use thiserror::Error;
 
 pub mod claims;
 pub mod comment;
@@ -17,8 +18,8 @@ pub mod post;
 pub mod site;
 pub mod user;
 
-#[derive(Fail, Debug)]
-#[fail(display = "{{\"error\":\"{}\"}}", message)]
+#[derive(Debug, Error)]
+#[error("{{\"error\":\"{message}\"}}")]
 pub struct APIError {
   pub message: String,
 }
index 5a1cdeb82e7588cd1faafc52df8257f531839a51..7245364e760a70e7cb7e3b6265c3f243b1301a17 100644 (file)
@@ -2,6 +2,7 @@ use crate::{apub::ActorType, LemmyError};
 use activitystreams_ext::UnparsedExtension;
 use activitystreams_new::unparsed::UnparsedMutExt;
 use actix_web::{client::ClientRequest, HttpRequest};
+use anyhow::anyhow;
 use http_signature_normalization_actix::{
   digest::{DigestClient, SignExt},
   Config,
@@ -70,7 +71,7 @@ pub fn verify(request: &HttpRequest, actor: &dyn ActorType) -> Result<(), LemmyE
     debug!("verified signature for {}", &request.uri());
     Ok(())
   } else {
-    Err(format_err!("Invalid signature on request: {}", &request.uri()).into())
+    Err(anyhow!("Invalid signature on request: {}", &request.uri()).into())
   }
 }
 
index e2d505df7ac891bca3c39363474b33e0dd751c5f..c9de9159b1566c66f242930fbd14016ca58682d1 100644 (file)
@@ -17,6 +17,7 @@ use crate::{
 };
 use activitystreams_new::{base::BaseExt, collection::OrderedCollection, object::Note, prelude::*};
 use actix_web::client::Client;
+use anyhow::anyhow;
 use chrono::NaiveDateTime;
 use diesel::{result::Error::NotFound, PgConnection};
 use lemmy_db::{
@@ -66,7 +67,7 @@ where
   Response: for<'de> Deserialize<'de>,
 {
   if !is_apub_id_valid(&url) {
-    return Err(format_err!("Activitypub uri invalid or blocked: {}", url).into());
+    return Err(anyhow!("Activitypub uri invalid or blocked: {}", url).into());
   }
 
   let timeout = Duration::from_secs(60);
@@ -125,10 +126,10 @@ pub async fn search_by_apub_id(
         let split2 = split[0].split('!').collect::<Vec<&str>>();
         (format!("/c/{}", split2[1]), split[1])
       } else {
-        return Err(format_err!("Invalid search query: {}", query).into());
+        return Err(anyhow!("Invalid search query: {}", query).into());
       }
     } else {
-      return Err(format_err!("Invalid search query: {}", query).into());
+      return Err(anyhow!("Invalid search query: {}", query).into());
     };
 
     let url = format!("{}://{}{}", get_apub_protocol_string(), instance, name);
index 332364843ce0ca30635c614e4b3f0d4f9025e201..b22d71dddb90c7bb0ff478500c96deffd57e948c 100644 (file)
@@ -22,6 +22,7 @@ use crate::{
 };
 use activitystreams_new::{activity::*, base::AnyBase, object::Note, prelude::*};
 use actix_web::{client::Client, HttpResponse};
+use anyhow::anyhow;
 use lemmy_db::{
   comment::{Comment, CommentForm, CommentLike, CommentLikeForm},
   comment_view::CommentView,
@@ -63,7 +64,7 @@ async fn receive_undo_delete(
     "Note" => receive_undo_delete_comment(undo, &delete, client, pool, chat_server).await,
     "Page" => receive_undo_delete_post(undo, &delete, client, pool, chat_server).await,
     "Group" => receive_undo_delete_community(undo, &delete, client, pool, chat_server).await,
-    d => Err(format_err!("Undo Delete type {} not supported", d).into()),
+    d => Err(anyhow!("Undo Delete type {} not supported", d).into()),
   }
 }
 
@@ -80,7 +81,7 @@ async fn receive_undo_remove(
     "Note" => receive_undo_remove_comment(undo, &remove, client, pool, chat_server).await,
     "Page" => receive_undo_remove_post(undo, &remove, client, pool, chat_server).await,
     "Group" => receive_undo_remove_community(undo, &remove, client, pool, chat_server).await,
-    d => Err(format_err!("Undo Delete type {} not supported", d).into()),
+    d => Err(anyhow!("Undo Delete type {} not supported", d).into()),
   }
 }
 
@@ -96,7 +97,7 @@ async fn receive_undo_like(
   match type_ {
     "Note" => receive_undo_like_comment(undo, &like, client, pool, chat_server).await,
     "Page" => receive_undo_like_post(undo, &like, client, pool, chat_server).await,
-    d => Err(format_err!("Undo Delete type {} not supported", d).into()),
+    d => Err(anyhow!("Undo Delete type {} not supported", d).into()),
   }
 }
 
@@ -109,7 +110,7 @@ async fn receive_undo_dislike(
   let dislike = Dislike::from_any_base(undo.object().to_owned().one().unwrap())?.unwrap();
 
   let type_ = dislike.object().as_single_kind_str().unwrap();
-  Err(format_err!("Undo Delete type {} not supported", type_).into())
+  Err(anyhow!("Undo Delete type {} not supported", type_).into())
 }
 
 async fn receive_undo_delete_comment(
index 8088ec5c356cd51d419a9d8434a78a53068d8afa..cd860a7f789b705add451c99c5c915613c57c65b 100644 (file)
@@ -14,6 +14,7 @@ use activitystreams_new::{
   prelude::*,
 };
 use actix_web::{client::Client, web, HttpRequest, HttpResponse};
+use anyhow::anyhow;
 use lemmy_db::{
   community::{Community, CommunityFollower, CommunityFollowerForm},
   user::User_,
@@ -57,7 +58,7 @@ pub async fn community_inbox(
 
   if !community.local {
     return Err(
-      format_err!(
+      anyhow!(
         "Received activity is addressed to remote community {}",
         &community.actor_id
       )
index feb1f30fc1d05f16e432d2582b0be21b71f80f30..fb0cc66f6b854f736c3a71bd6ed9c17b492cb87a 100644 (file)
@@ -28,8 +28,8 @@ use activitystreams_new::{
   prelude::*,
 };
 use actix_web::{body::Body, client::Client, HttpResponse};
+use anyhow::anyhow;
 use chrono::NaiveDateTime;
-use failure::_core::fmt::Debug;
 use lemmy_db::{activity::do_insert_activity, user::User_};
 use lemmy_utils::{convert_datetime, get_apub_protocol_string, settings::Settings, MentionData};
 use log::debug;
@@ -118,10 +118,10 @@ where
       tombstone.set_deleted(convert_datetime(updated));
       Ok(tombstone)
     } else {
-      Err(format_err!("Cant convert to tombstone because updated time was None.").into())
+      Err(anyhow!("Cant convert to tombstone because updated time was None.").into())
     }
   } else {
-    Err(format_err!("Cant convert object to tombstone if it wasnt deleted").into())
+    Err(anyhow!("Cant convert object to tombstone if it wasnt deleted").into())
   }
 }
 
@@ -339,13 +339,13 @@ pub async fn fetch_webfinger_url(
     .links
     .iter()
     .find(|l| l.type_.eq(&Some("application/activity+json".to_string())))
-    .ok_or_else(|| format_err!("No application/activity+json link found."))?;
+    .ok_or_else(|| anyhow!("No application/activity+json link found."))?;
   link
     .href
     .to_owned()
     .map(|u| Url::parse(&u))
     .transpose()?
-    .ok_or_else(|| format_err!("No href found.").into())
+    .ok_or_else(|| anyhow!("No href found.").into())
 }
 
 pub async fn insert_activity<T>(
@@ -355,7 +355,7 @@ pub async fn insert_activity<T>(
   pool: &DbPool,
 ) -> Result<(), LemmyError>
 where
-  T: Serialize + Debug + Send + 'static,
+  T: Serialize + std::fmt::Debug + Send + 'static,
 {
   blocking(pool, move |conn| {
     do_insert_activity(conn, user_id, &data, local)
index 682efc774458b6a5c970ba8adfae1ef6fed7269f..ace8438184da1ffb938645154701e1dd88fd4153 100644 (file)
@@ -3,8 +3,6 @@
 pub extern crate strum_macros;
 #[macro_use]
 pub extern crate lazy_static;
-#[macro_use]
-pub extern crate failure;
 pub extern crate actix;
 pub extern crate actix_web;
 pub extern crate base64;
@@ -33,6 +31,7 @@ pub mod websocket;
 
 use crate::request::{retry, RecvError};
 use actix_web::{client::Client, dev::ConnectionInfo};
+use anyhow::anyhow;
 use lemmy_utils::{get_apub_protocol_string, settings::Settings};
 use log::error;
 use percent_encoding::{utf8_percent_encode, NON_ALPHANUMERIC};
@@ -48,12 +47,12 @@ pub type IPAddr = String;
 
 #[derive(Debug)]
 pub struct LemmyError {
-  inner: failure::Error,
+  inner: anyhow::Error,
 }
 
 impl<T> From<T> for LemmyError
 where
-  T: Into<failure::Error>,
+  T: Into<anyhow::Error>,
 {
   fn from(t: T) -> Self {
     LemmyError { inner: t.into() }
@@ -118,7 +117,7 @@ pub async fn fetch_pictrs(client: &Client, image_url: &str) -> Result<PictrsResp
   if response.msg == "ok" {
     Ok(response)
   } else {
-    Err(format_err!("{}", &response.msg).into())
+    Err(anyhow!("{}", &response.msg).into())
   }
 }
 
@@ -191,13 +190,13 @@ pub async fn is_image_content_type(client: &Client, test: &str) -> Result<(), Le
   if response
     .headers()
     .get("Content-Type")
-    .ok_or_else(|| format_err!("No Content-Type header"))?
+    .ok_or_else(|| anyhow!("No Content-Type header"))?
     .to_str()?
     .starts_with("image/")
   {
     Ok(())
   } else {
-    Err(format_err!("Not an image type.").into())
+    Err(anyhow!("Not an image type.").into())
   }
 }
 
index 7d09b60df99ac820f0aadfa4f7e90a5bf470b2f1..70a2b6933ead96078d2e4e968d02410193789436 100644 (file)
@@ -1,12 +1,14 @@
 use crate::LemmyError;
+use anyhow::anyhow;
 use std::future::Future;
+use thiserror::Error;
 
-#[derive(Clone, Debug, Fail)]
-#[fail(display = "Error sending request, {}", _0)]
+#[derive(Clone, Debug, Error)]
+#[error("Error sending request, {0}")]
 struct SendError(pub String);
 
-#[derive(Clone, Debug, Fail)]
-#[fail(display = "Error receiving response, {}", _0)]
+#[derive(Clone, Debug, Error)]
+#[error("Error receiving response, {0}")]
 pub struct RecvError(pub String);
 
 pub async fn retry<F, Fut, T>(f: F) -> Result<T, LemmyError>
@@ -22,7 +24,7 @@ where
   F: Fn() -> Fut,
   Fut: Future<Output = Result<Result<T, actix_web::client::SendRequestError>, LemmyError>>,
 {
-  let mut response = Err(format_err!("connect timeout").into());
+  let mut response = Err(anyhow!("connect timeout").into());
 
   for _ in 0u8..3 {
     match (f)().await? {
index 1322feb440e04da295f5dff326ab48e5ffed73e3..40e0ab658d08da6ee0e4ce4f060fcb8e9e09c851 100644 (file)
@@ -1,5 +1,6 @@
 use crate::{api::claims::Claims, blocking, routes::DbPoolParam, LemmyError};
 use actix_web::{error::ErrorBadRequest, *};
+use anyhow::anyhow;
 use chrono::{DateTime, NaiveDateTime, Utc};
 use diesel::{
   r2d2::{ConnectionManager, Pool},
@@ -88,7 +89,7 @@ async fn get_feed(
     "c" => RequestType::Community,
     "front" => RequestType::Front,
     "inbox" => RequestType::Inbox,
-    _ => return Err(ErrorBadRequest(LemmyError::from(format_err!("wrong_type")))),
+    _ => return Err(ErrorBadRequest(LemmyError::from(anyhow!("wrong_type")))),
   };
 
   let param = path.1.to_owned();
index 5094c2f15e571342376ddb0f46962fa7f37adc77..a18d06ea2837bc46e1337b936237711bd6254d0e 100644 (file)
@@ -1,5 +1,6 @@
 use crate::{blocking, routes::DbPoolParam, version, LemmyError};
 use actix_web::{body::Body, error::ErrorBadRequest, *};
+use anyhow::anyhow;
 use lemmy_db::site_view::SiteView;
 use lemmy_utils::{get_apub_protocol_string, settings::Settings};
 use serde::{Deserialize, Serialize};
@@ -28,7 +29,7 @@ async fn node_info_well_known() -> Result<HttpResponse<Body>, LemmyError> {
 async fn node_info(db: DbPoolParam) -> Result<HttpResponse, Error> {
   let site_view = blocking(&db, SiteView::read)
     .await?
-    .map_err(|_| ErrorBadRequest(LemmyError::from(format_err!("not_found"))))?;
+    .map_err(|_| ErrorBadRequest(LemmyError::from(anyhow!("not_found"))))?;
 
   let protocols = if Settings::get().federation.enabled {
     vec!["activitypub".to_string()]
index e616de0e8ed9bd2116f5fa2c4c5e7c79eb0561b2..81fad6110cc1dd3d0aab9d5b07f19d9937c212cf 100644 (file)
@@ -1,5 +1,6 @@
 use crate::{blocking, routes::DbPoolParam, LemmyError};
 use actix_web::{error::ErrorBadRequest, web::Query, *};
+use anyhow::anyhow;
 use lemmy_db::{community::Community, user::User_};
 use lemmy_utils::{settings::Settings, WEBFINGER_COMMUNITY_REGEX, WEBFINGER_USER_REGEX};
 use serde::{Deserialize, Serialize};
@@ -62,17 +63,17 @@ async fn get_webfinger_response(
       Community::read_from_name(conn, &community_name)
     })
     .await?
-    .map_err(|_| ErrorBadRequest(LemmyError::from(format_err!("not_found"))))?
+    .map_err(|_| ErrorBadRequest(LemmyError::from(anyhow!("not_found"))))?
     .actor_id
   } else if let Some(user_name) = user_regex_parsed {
     let user_name = user_name.as_str().to_owned();
     // Make sure the requested user exists.
     blocking(&db, move |conn| User_::read_from_name(conn, &user_name))
       .await?
-      .map_err(|_| ErrorBadRequest(LemmyError::from(format_err!("not_found"))))?
+      .map_err(|_| ErrorBadRequest(LemmyError::from(anyhow!("not_found"))))?
       .actor_id
   } else {
-    return Err(ErrorBadRequest(LemmyError::from(format_err!("not_found"))));
+    return Err(ErrorBadRequest(LemmyError::from(anyhow!("not_found"))));
   };
 
   let json = WebFingerResponse {