"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"
"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"
"actix-rt",
"actix-web",
"actix-web-actors",
+ "anyhow",
"async-trait",
"awc",
"base64 0.12.3",
"diesel_migrations",
"dotenv",
"env_logger",
- "failure",
"futures",
"http",
"http-signature-normalization-actix",
"sha2",
"strum",
"strum_macros",
+ "thiserror",
"tokio",
"url",
"uuid 0.8.1",
"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"
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"] }
sha2 = "0.9"
async-trait = "0.1.36"
captcha = "0.0.7"
+anyhow = "1.0.32"
+thiserror = "1.0.20"
user_view::*,
Crud,
};
+use thiserror::Error;
pub mod claims;
pub mod comment;
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,
}
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,
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())
}
}
};
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::{
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);
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);
};
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,
"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()),
}
}
"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()),
}
}
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()),
}
}
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(
prelude::*,
};
use actix_web::{client::Client, web, HttpRequest, HttpResponse};
+use anyhow::anyhow;
use lemmy_db::{
community::{Community, CommunityFollower, CommunityFollowerForm},
user::User_,
if !community.local {
return Err(
- format_err!(
+ anyhow!(
"Received activity is addressed to remote community {}",
&community.actor_id
)
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;
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())
}
}
.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>(
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)
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;
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};
#[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() }
if response.msg == "ok" {
Ok(response)
} else {
- Err(format_err!("{}", &response.msg).into())
+ Err(anyhow!("{}", &response.msg).into())
}
}
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())
}
}
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>
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? {
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},
"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();
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};
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()]
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};
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 {