[fractal] BKResponse, user: remove error variants and compose over Result instead
- From: Alexandre Franke <afranke src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [fractal] BKResponse, user: remove error variants and compose over Result instead
- Date: Wed, 25 Sep 2019 20:01:15 +0000 (UTC)
commit e964b5ec5e123ce484796cc219c3e3cb143a06ae
Author: Alejandro Domínguez <adomu net-c com>
Date: Mon Aug 26 22:36:37 2019 +0200
BKResponse, user: remove error variants and compose over Result instead
fractal-gtk/src/app/backend_loop.rs | 38 ++--
fractal-matrix-api/src/backend/mod.rs | 2 +-
fractal-matrix-api/src/backend/types.rs | 41 ++--
fractal-matrix-api/src/backend/user.rs | 332 +++++++++++---------------------
fractal-matrix-api/src/error.rs | 1 +
5 files changed, 145 insertions(+), 269 deletions(-)
---
diff --git a/fractal-gtk/src/app/backend_loop.rs b/fractal-gtk/src/app/backend_loop.rs
index 81d82c67..0efb0e90 100644
--- a/fractal-gtk/src/app/backend_loop.rs
+++ b/fractal-gtk/src/app/backend_loop.rs
@@ -32,58 +32,58 @@ pub fn backend_loop(rx: Receiver<BKResponse>) {
Ok(BKResponse::Logout(Ok(_))) => {
APPOP!(bk_logout);
}
- Ok(BKResponse::Name(username)) => {
+ Ok(BKResponse::Name(Ok(username))) => {
let u = Some(username);
APPOP!(set_username, (u));
}
- Ok(BKResponse::GetThreePID(list)) => {
+ Ok(BKResponse::GetThreePID(Ok(list))) => {
let l = Some(list);
APPOP!(set_three_pid, (l));
}
- Ok(BKResponse::GetTokenEmail(sid, secret)) => {
+ Ok(BKResponse::GetTokenEmail(Ok((sid, secret)))) => {
let sid = Some(sid);
let secret = Some(secret);
APPOP!(get_token_email, (sid, secret));
}
- Ok(BKResponse::GetTokenPhone(sid, secret)) => {
+ Ok(BKResponse::GetTokenPhone(Ok((sid, secret)))) => {
let sid = Some(sid);
let secret = Some(secret);
APPOP!(get_token_phone, (sid, secret));
}
- Ok(BKResponse::GetTokenEmailUsed) => {
+ Ok(BKResponse::GetTokenEmail(Err(Error::TokenUsed))) => {
let error = i18n("Email is already in use");
APPOP!(show_three_pid_error_dialog, (error));
}
- Ok(BKResponse::GetTokenPhoneUsed) => {
+ Ok(BKResponse::GetTokenPhone(Err(Error::TokenUsed))) => {
let error = i18n("Phone number is already in use");
APPOP!(show_three_pid_error_dialog, (error));
}
- Ok(BKResponse::SubmitPhoneToken(sid, secret)) => {
+ Ok(BKResponse::SubmitPhoneToken(Ok((sid, secret)))) => {
let secret = Some(secret);
APPOP!(valid_phone_token, (sid, secret));
}
- Ok(BKResponse::AddThreePID(list)) => {
+ Ok(BKResponse::AddThreePID(Ok(list))) => {
let l = Some(list);
APPOP!(added_three_pid, (l));
}
- Ok(BKResponse::DeleteThreePID) => {
+ Ok(BKResponse::DeleteThreePID(Ok(_))) => {
APPOP!(get_three_pid);
}
- Ok(BKResponse::ChangePassword) => {
+ Ok(BKResponse::ChangePassword(Ok(_))) => {
APPOP!(password_changed);
}
- Ok(BKResponse::SetUserName(username)) => {
+ Ok(BKResponse::SetUserName(Ok(username))) => {
let u = Some(username);
APPOP!(show_new_username, (u));
}
- Ok(BKResponse::AccountDestruction) => {
+ Ok(BKResponse::AccountDestruction(Ok(_))) => {
APPOP!(account_destruction_logoff);
}
- Ok(BKResponse::Avatar(path)) => {
+ Ok(BKResponse::Avatar(Ok(path))) => {
let av = Some(path);
APPOP!(set_avatar, (av));
}
- Ok(BKResponse::SetUserAvatar(path)) => {
+ Ok(BKResponse::SetUserAvatar(Ok(path))) => {
let av = Some(path);
APPOP!(show_new_avatar, (av));
}
@@ -183,27 +183,27 @@ pub fn backend_loop(rx: Receiver<BKResponse>) {
Ok(BKResponse::AddedToFav(Ok((r, tofav)))) => {
APPOP!(added_to_fav, (r, tofav));
}
- Ok(BKResponse::UserSearch(users)) => {
+ Ok(BKResponse::UserSearch(Ok(users))) => {
APPOP!(user_search_finished, (users));
}
// errors
- Ok(BKResponse::AccountDestructionError(err)) => {
+ Ok(BKResponse::AccountDestruction(Err(err))) => {
let error = i18n("Couldn’t delete the account");
error!("{:?}", err);
APPOP!(show_error_dialog, (error));
}
- Ok(BKResponse::ChangePasswordError(err)) => {
+ Ok(BKResponse::ChangePassword(Err(err))) => {
let error = i18n("Couldn’t change the password");
error!("{:?}", err);
APPOP!(show_password_error_dialog, (error));
}
- Ok(BKResponse::GetTokenEmailError(err)) => {
+ Ok(BKResponse::GetTokenEmail(Err(err))) => {
let error = i18n("Couldn’t add the email address.");
error!("{:?}", err);
APPOP!(show_three_pid_error_dialog, (error));
}
- Ok(BKResponse::GetTokenPhoneError(err)) => {
+ Ok(BKResponse::GetTokenPhone(Err(err))) => {
let error = i18n("Couldn’t add the phone number.");
error!("{:?}", err);
APPOP!(show_three_pid_error_dialog, (error));
diff --git a/fractal-matrix-api/src/backend/mod.rs b/fractal-matrix-api/src/backend/mod.rs
index dac3fbc3..d79fdf63 100644
--- a/fractal-matrix-api/src/backend/mod.rs
+++ b/fractal-matrix-api/src/backend/mod.rs
@@ -134,7 +134,7 @@ impl Backend {
Ok(BKCommand::SetUserAvatar(file)) => user::set_user_avatar(self, file),
Ok(BKCommand::GetAvatarAsync(member, ctx)) => user::get_avatar_async(self, member, ctx),
Ok(BKCommand::GetUserInfoAsync(sender, ctx)) => {
- user::get_user_info_async(self, &sender, ctx)
+ user::get_user_info_async(self, sender, ctx)
}
Ok(BKCommand::GetUserNameAsync(sender, ctx)) => {
user::get_username_async(self, sender, ctx)
diff --git a/fractal-matrix-api/src/backend/types.rs b/fractal-matrix-api/src/backend/types.rs
index 40d0e945..ca2bf248 100644
--- a/fractal-matrix-api/src/backend/types.rs
+++ b/fractal-matrix-api/src/backend/types.rs
@@ -90,20 +90,18 @@ pub enum BKResponse {
ShutDown,
Token(String, String, Option<String>),
Logout(Result<(), Error>),
- Name(String),
- SetUserName(String),
- GetThreePID(Vec<ThirdPartyIdentifier>),
- GetTokenEmail(String, String),
- GetTokenPhone(String, String),
- SubmitPhoneToken(Option<String>, String),
- AddThreePID(String),
- GetTokenPhoneUsed,
- GetTokenEmailUsed,
- DeleteThreePID,
- ChangePassword,
- AccountDestruction,
- Avatar(String),
- SetUserAvatar(String),
+ Name(Result<String, Error>),
+ SetUserName(Result<String, Error>),
+ GetThreePID(Result<Vec<ThirdPartyIdentifier>, Error>),
+ GetTokenEmail(Result<(String, String), Error>),
+ GetTokenPhone(Result<(String, String), Error>),
+ SubmitPhoneToken(Result<(Option<String>, String), Error>),
+ AddThreePID(Result<String, Error>),
+ DeleteThreePID(Result<(), Error>),
+ ChangePassword(Result<(), Error>),
+ AccountDestruction(Result<(), Error>),
+ Avatar(Result<String, Error>),
+ SetUserAvatar(Result<String, Error>),
Sync(Result<String, Error>),
Rooms(Vec<Room>, Option<Room>),
UpdateRooms(Vec<Room>),
@@ -133,27 +131,14 @@ pub enum BKResponse {
NewRoom(Result<Room, Error>, String),
AddedToFav(Result<(String, bool), Error>),
RoomNotifications(String, i32, i32),
- UserSearch(Vec<Member>),
+ UserSearch(Result<Vec<Member>, Error>),
Stickers(Result<Vec<StickerGroup>, Error>),
//errors
- UserNameError(Error),
- SetUserNameError(Error),
- GetThreePIDError(Error),
- GetTokenEmailError(Error),
- GetTokenPhoneError(Error),
- SubmitPhoneTokenError(Error),
- AddThreePIDError(Error),
- DeleteThreePIDError(Error),
- ChangePasswordError(Error),
- AccountDestructionError(Error),
- AvatarError(Error),
- SetUserAvatarError(Error),
LoginError(Error),
GuestLoginError(Error),
SendTypingError(Error),
SetRoomError(Error),
- CommandError(Error),
GetFileAsyncError(Error),
InviteError(Error),
}
diff --git a/fractal-matrix-api/src/backend/user.rs b/fractal-matrix-api/src/backend/user.rs
index 97a9e3e8..83d19777 100644
--- a/fractal-matrix-api/src/backend/user.rs
+++ b/fractal-matrix-api/src/backend/user.rs
@@ -79,19 +79,11 @@ pub fn get_username(bk: &Backend) {
.execute(request)?
.json::<GetDisplayNameResponse>()
.map_err(Into::into)
- });
+ })
+ .map(|response| response.displayname.unwrap_or(uid));
- match query {
- Ok(response) => {
- let name = response.displayname.unwrap_or(uid);
- tx.send(BKResponse::Name(name))
- .expect_log("Connection closed");
- }
- Err(err) => {
- tx.send(BKResponse::UserNameError(err))
- .expect_log("Connection closed");
- }
- }
+ tx.send(BKResponse::Name(query))
+ .expect_log("Connection closed");
});
}
@@ -109,17 +101,12 @@ pub fn get_username_async(bk: &Backend, uid: String, tx: Sender<String>) {
.execute(request)?
.json::<GetDisplayNameResponse>()
.map_err(Into::into)
- });
+ })
+ .ok()
+ .and_then(|response| response.displayname)
+ .unwrap_or(uid);
- match query {
- Ok(response) => {
- let name = response.displayname.unwrap_or(uid);
- tx.send(name).expect_log("Connection closed");
- }
- Err(_) => {
- tx.send(uid).expect_log("Connection closed");
- }
- }
+ tx.send(query).expect_log("Connection closed");
});
}
@@ -142,18 +129,11 @@ pub fn set_username(bk: &Backend, name: String) {
.get_client()?
.execute(request)
.map_err(Into::into)
- });
+ })
+ .and(Ok(name));
- match query {
- Ok(_) => {
- tx.send(BKResponse::SetUserName(name))
- .expect_log("Connection closed");
- }
- Err(err) => {
- tx.send(BKResponse::SetUserNameError(err))
- .expect_log("Connection closed");
- }
- }
+ tx.send(BKResponse::SetUserName(query))
+ .expect_log("Connection closed");
});
}
@@ -173,18 +153,11 @@ pub fn get_threepid(bk: &Backend) {
.execute(request)?
.json::<ThirdPartyIDResponse>()
.map_err(Into::into)
- });
+ })
+ .map(|response| response.threepids);
- match query {
- Ok(response) => {
- tx.send(BKResponse::GetThreePID(response.threepids))
- .expect_log("Connection closed");
- }
- Err(err) => {
- tx.send(BKResponse::GetThreePIDError(err))
- .expect_log("Connection closed");
- }
- }
+ tx.send(BKResponse::GetThreePID(query))
+ .expect_log("Connection closed");
});
}
@@ -211,24 +184,19 @@ pub fn get_email_token(bk: &Backend, identity: String, email: String, client_sec
.execute(request)?
.json::<EmailTokenResponse>()
.map_err(Into::into)
+ })
+ .map(|response| (response.sid, client_secret))
+ .map_err(|error| match error {
+ Error::MatrixError(ref js)
+ if js["errcode"].as_str().unwrap_or_default() == "M_THREEPID_IN_USE" =>
+ {
+ Error::TokenUsed
+ }
+ err => err,
});
- match query {
- Ok(response) => {
- tx.send(BKResponse::GetTokenEmail(response.sid, client_secret))
- .expect_log("Connection closed");
- }
- Err(Error::MatrixError(ref js))
- if js["errcode"].as_str().unwrap_or_default() == "M_THREEPID_IN_USE" =>
- {
- tx.send(BKResponse::GetTokenEmailUsed)
- .expect_log("Connection closed");
- }
- Err(err) => {
- tx.send(BKResponse::GetTokenEmailError(err))
- .expect_log("Connection closed");
- }
- }
+ tx.send(BKResponse::GetTokenEmail(query))
+ .expect_log("Connection closed");
});
}
@@ -256,24 +224,19 @@ pub fn get_phone_token(bk: &Backend, identity: String, phone: String, client_sec
.execute(request)?
.json::<PhoneTokenResponse>()
.map_err(Into::into)
+ })
+ .map(|response| (response.sid, client_secret))
+ .map_err(|error| match error {
+ Error::MatrixError(ref js)
+ if js["errcode"].as_str().unwrap_or_default() == "M_THREEPID_IN_USE" =>
+ {
+ Error::TokenUsed
+ }
+ err => err,
});
- match query {
- Ok(response) => {
- tx.send(BKResponse::GetTokenPhone(response.sid, client_secret))
- .expect_log("Connection closed");
- }
- Err(Error::MatrixError(ref js))
- if js["errcode"].as_str().unwrap_or_default() == "M_THREEPID_IN_USE" =>
- {
- tx.send(BKResponse::GetTokenPhoneUsed)
- .expect_log("Connection closed");
- }
- Err(err) => {
- tx.send(BKResponse::GetTokenPhoneError(err))
- .expect_log("Connection closed");
- }
- }
+ tx.send(BKResponse::GetTokenPhone(query))
+ .expect_log("Connection closed");
});
}
@@ -300,18 +263,11 @@ pub fn add_threepid(bk: &Backend, identity: String, client_secret: String, sid:
.get_client()?
.execute(request)
.map_err(Into::into)
- });
+ })
+ .and(Ok(sid));
- match query {
- Ok(_) => {
- tx.send(BKResponse::AddThreePID(sid))
- .expect_log("Connection closed");
- }
- Err(err) => {
- tx.send(BKResponse::AddThreePIDError(err))
- .expect_log("Connection closed");
- }
- }
+ tx.send(BKResponse::AddThreePID(query))
+ .expect_log("Connection closed");
});
}
@@ -334,19 +290,11 @@ pub fn submit_phone_token(bk: &Backend, client_secret: String, sid: String, toke
.execute(request)?
.json::<SubmitPhoneTokenResponse>()
.map_err(Into::into)
- });
+ })
+ .map(|response| (Some(sid).filter(|_| response.success), client_secret));
- match query {
- Ok(response) => {
- let result = Some(sid).filter(|_| response.success);
- tx.send(BKResponse::SubmitPhoneToken(result, client_secret))
- .expect_log("Connection closed");
- }
- Err(err) => {
- tx.send(BKResponse::SubmitPhoneTokenError(err))
- .expect_log("Connection closed");
- }
- }
+ tx.send(BKResponse::SubmitPhoneToken(query))
+ .expect_log("Connection closed");
});
}
@@ -366,18 +314,11 @@ pub fn delete_three_pid(bk: &Backend, medium: Medium, address: String) {
.get_client()?
.execute(request)
.map_err(Into::into)
- });
+ })
+ .and(Ok(()));
- match query {
- Ok(_) => {
- tx.send(BKResponse::DeleteThreePID)
- .expect_log("Connection closed");
- }
- Err(err) => {
- tx.send(BKResponse::DeleteThreePIDError(err))
- .expect_log("Connection closed");
- }
- }
+ tx.send(BKResponse::DeleteThreePID(query))
+ .expect_log("Connection closed");
});
}
@@ -404,18 +345,11 @@ pub fn change_password(bk: &Backend, user: String, old_password: String, new_pas
.get_client()?
.execute(request)
.map_err(Into::into)
- });
+ })
+ .and(Ok(()));
- match query {
- Ok(_) => {
- tx.send(BKResponse::ChangePassword)
- .expect_log("Connection closed");
- }
- Err(err) => {
- tx.send(BKResponse::ChangePasswordError(err))
- .expect_log("Connection closed");
- }
- }
+ tx.send(BKResponse::ChangePassword(query))
+ .expect_log("Connection closed");
});
}
@@ -441,18 +375,11 @@ pub fn account_destruction(bk: &Backend, user: String, password: String) {
.get_client()?
.execute(request)
.map_err(Into::into)
- });
+ })
+ .and(Ok(()));
- match query {
- Ok(_) => {
- tx.send(BKResponse::AccountDestruction)
- .expect_log("Connection closed");
- }
- Err(err) => {
- tx.send(BKResponse::AccountDestructionError(err))
- .expect_log("Connection closed");
- }
- }
+ tx.send(BKResponse::AccountDestruction(query))
+ .expect_log("Connection closed");
});
}
@@ -461,15 +388,10 @@ pub fn get_avatar(bk: &Backend) {
let userid = bk.data.lock().unwrap().user_id.clone();
let tx = bk.tx.clone();
- thread::spawn(move || match get_user_avatar(&base, &userid) {
- Ok((_, fname)) => {
- tx.send(BKResponse::Avatar(fname))
- .expect_log("Connection closed");
- }
- Err(err) => {
- tx.send(BKResponse::AvatarError(err))
- .expect_log("Connection closed");
- }
+ thread::spawn(move || {
+ let query = get_user_avatar(&base, &userid).map(|(_, fname)| fname);
+ tx.send(BKResponse::Avatar(query))
+ .expect_log("Connection closed");
});
}
@@ -479,17 +401,10 @@ pub fn get_avatar_async(bk: &Backend, member: Option<Member>, tx: Sender<String>
let uid = member.uid.clone();
let avatar = member.avatar.clone().unwrap_or_default();
- semaphore(
- bk.limit_threads.clone(),
- move || match get_user_avatar_img(&base, &uid, &avatar) {
- Ok(fname) => {
- tx.send(fname).expect_log("Connection closed");
- }
- Err(_) => {
- tx.send(Default::default()).expect_log("Connection closed");
- }
- },
- );
+ semaphore(bk.limit_threads.clone(), move || {
+ let fname = get_user_avatar_img(&base, &uid, &avatar).unwrap_or_default();
+ tx.send(fname).expect_log("Connection closed");
+ });
} else {
tx.send(Default::default()).expect_log("Connection closed");
}
@@ -507,54 +422,47 @@ pub fn set_user_avatar(bk: &Backend, avatar: String) {
};
thread::spawn(move || {
- let query = fs::read(&avatar).map_err(Into::into).and_then(|contents| {
- let (mime, _) = gio::content_type_guess(None, &contents);
- let mime_value = HeaderValue::from_str(&mime).or(Err(Error::BackendError))?;
- let upload_response =
- create_content(base.clone(), ¶ms_upload, contents, Some(mime_value))
- .map_err::<Error, _>(Into::into)
+ let query = fs::read(&avatar)
+ .map_err(Into::into)
+ .and_then(|contents| {
+ let (mime, _) = gio::content_type_guess(None, &contents);
+ let mime_value = HeaderValue::from_str(&mime).or(Err(Error::BackendError))?;
+ let upload_response =
+ create_content(base.clone(), ¶ms_upload, contents, Some(mime_value))
+ .map_err::<Error, _>(Into::into)
+ .and_then(|request| {
+ HTTP_CLIENT
+ .get_client()?
+ .execute(request)?
+ .json::<CreateContentResponse>()
+ .map_err(Into::into)
+ })?;
+
+ let params_avatar = SetAvatarUrlParameters { access_token };
+ let body = SetAvatarUrlBody {
+ avatar_url: Some(upload_response.content_uri),
+ };
+
+ set_avatar_url(base, ¶ms_avatar, &body, &encode_uid(&id))
+ .map_err(Into::into)
.and_then(|request| {
HTTP_CLIENT
.get_client()?
- .execute(request)?
- .json::<CreateContentResponse>()
+ .execute(request)
.map_err(Into::into)
- })?;
-
- let params_avatar = SetAvatarUrlParameters { access_token };
- let body = SetAvatarUrlBody {
- avatar_url: Some(upload_response.content_uri),
- };
-
- set_avatar_url(base, ¶ms_avatar, &body, &encode_uid(&id))
- .map_err(Into::into)
- .and_then(|request| {
- HTTP_CLIENT
- .get_client()?
- .execute(request)
- .map_err(Into::into)
- })
- });
+ })
+ })
+ .and(Ok(avatar));
- match query {
- Ok(_) => {
- tx.send(BKResponse::SetUserAvatar(avatar))
- .expect_log("Connection closed");
- }
- Err(err) => {
- tx.send(BKResponse::SetUserAvatarError(err))
- .expect_log("Connection closed");
- }
- }
+ tx.send(BKResponse::SetUserAvatar(query))
+ .expect_log("Connection closed");
});
}
-pub fn get_user_info_async(bk: &mut Backend, uid: &str, tx: Option<Sender<(String, String)>>) {
+pub fn get_user_info_async(bk: &mut Backend, uid: String, tx: Option<Sender<(String, String)>>) {
let baseu = bk.get_base_url();
- let u = uid.to_string();
-
- if let Some(info) = bk.user_info_cache.get(&u) {
+ if let Some(info) = bk.user_info_cache.get(&uid) {
if let Some(tx) = tx.clone() {
let info = info.clone();
thread::spawn(move || {
@@ -565,31 +473,21 @@ pub fn get_user_info_async(bk: &mut Backend, uid: &str, tx: Option<Sender<(Strin
return;
}
- let info = Arc::new(Mutex::new((String::new(), String::new())));
- let cache_key = u.clone();
- let cache_value = info.clone();
+ let info: Arc<Mutex<(String, String)>> = Default::default();
+ bk.user_info_cache.insert(uid.clone(), info.clone());
semaphore(bk.limit_threads.clone(), move || {
- let i0 = info.lock();
- match get_user_avatar(&baseu, &u) {
- Ok(info) => {
- if let Some(tx) = tx.clone() {
- tx.send(info.clone()).expect_log("Connection closed");
- let mut i = i0.unwrap();
- i.0 = info.0;
- i.1 = info.1;
- }
+ match (get_user_avatar(&baseu, &uid), tx) {
+ (Ok(i0), Some(tx)) => {
+ tx.send(i0.clone()).expect_log("Connection closed");
+ *info.lock().unwrap() = i0;
}
- Err(_) => {
- if let Some(tx) = tx.clone() {
- tx.send((String::new(), String::new()))
- .expect_log("Connection closed");
- }
+ (Err(_), Some(tx)) => {
+ tx.send(Default::default()).expect_log("Connection closed");
}
+ _ => {}
};
});
-
- bk.user_info_cache.insert(cache_key, cache_value);
}
pub fn search(bk: &Backend, search_term: String) {
@@ -612,19 +510,11 @@ pub fn search(bk: &Backend, search_term: String) {
.execute(request)?
.json::<UserDirectoryResponse>()
.map_err(Into::into)
- });
+ })
+ .map(|response| response.results.into_iter().map(Into::into).collect());
- match query {
- Ok(response) => {
- let users = response.results.into_iter().map(Into::into).collect();
- tx.send(BKResponse::UserSearch(users))
- .expect_log("Connection closed");
- }
- Err(err) => {
- tx.send(BKResponse::CommandError(err))
- .expect_log("Connection closed");
- }
- }
+ tx.send(BKResponse::UserSearch(query))
+ .expect_log("Connection closed");
});
}
diff --git a/fractal-matrix-api/src/error.rs b/fractal-matrix-api/src/error.rs
index f2d18629..ea73e087 100644
--- a/fractal-matrix-api/src/error.rs
+++ b/fractal-matrix-api/src/error.rs
@@ -12,6 +12,7 @@ pub enum Error {
MatrixError(JsonValue),
SendMsgError(String),
SendMsgRedactionError(String),
+ TokenUsed,
}
impl From<reqwest::Error> for Error {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]