[fractal] API: Remove use of combinators



commit f3362ff174b652b31f54806fc153c8a4d4007876
Author: Alejandro Domínguez <adomu net-c com>
Date:   Tue Apr 28 02:48:39 2020 +0200

    API: Remove use of combinators

 fractal-matrix-api/src/backend/directory.rs |  22 +--
 fractal-matrix-api/src/backend/media.rs     |  18 +--
 fractal-matrix-api/src/backend/register.rs  |  27 ++--
 fractal-matrix-api/src/backend/room.rs      | 217 ++++++++++----------------
 fractal-matrix-api/src/backend/user.rs      | 230 ++++++++++------------------
 5 files changed, 180 insertions(+), 334 deletions(-)
---
diff --git a/fractal-matrix-api/src/backend/directory.rs b/fractal-matrix-api/src/backend/directory.rs
index 0982fe7a..b8ad698a 100644
--- a/fractal-matrix-api/src/backend/directory.rs
+++ b/fractal-matrix-api/src/backend/directory.rs
@@ -28,22 +28,14 @@ use crate::types::Room;
 
 pub fn protocols(base: Url, access_token: AccessToken) -> Result<Vec<ProtocolInstance>, Error> {
     let params = SupportedProtocolsParameters { access_token };
+    let request = get_supported_protocols(base, &params)?;
+    let response: SupportedProtocolsResponse =
+        HTTP_CLIENT.get_client()?.execute(request)?.json()?;
 
-    get_supported_protocols(base, &params)
-        .map_err(Into::into)
-        .and_then(|request| {
-            HTTP_CLIENT
-                .get_client()?
-                .execute(request)?
-                .json::<SupportedProtocolsResponse>()
-                .map_err(Into::into)
-        })
-        .map(|response| {
-            response
-                .into_iter()
-                .flat_map(|(_, protocol)| protocol.instances.into_iter())
-                .collect()
-        })
+    Ok(response
+        .into_iter()
+        .flat_map(|(_, protocol)| protocol.instances.into_iter())
+        .collect())
 }
 
 pub fn room_search(
diff --git a/fractal-matrix-api/src/backend/media.rs b/fractal-matrix-api/src/backend/media.rs
index 6322ba76..6a624071 100644
--- a/fractal-matrix-api/src/backend/media.rs
+++ b/fractal-matrix-api/src/backend/media.rs
@@ -86,18 +86,12 @@ fn get_room_media_list(
         },
     };
 
-    get_messages_events_req(baseu, &params, room_id)
-        .map_err(Into::into)
-        .and_then(|request| {
-            let response = HTTP_CLIENT
-                .get_client()?
-                .execute(request)?
-                .json::<GetMessagesEventsResponse>()?;
+    let request = get_messages_events_req(baseu, &params, room_id)?;
+    let response: GetMessagesEventsResponse = HTTP_CLIENT.get_client()?.execute(request)?.json()?;
 
-            let prev_batch = response.end.unwrap_or_default();
-            let evs = response.chunk.iter().rev();
-            let media_list = Message::from_json_events_iter(room_id, evs)?;
+    let prev_batch = response.end.unwrap_or_default();
+    let evs = response.chunk.iter().rev();
+    let media_list = Message::from_json_events_iter(room_id, evs)?;
 
-            Ok((media_list, prev_batch))
-        })
+    Ok((media_list, prev_batch))
 }
diff --git a/fractal-matrix-api/src/backend/register.rs b/fractal-matrix-api/src/backend/register.rs
index 8d50ea1f..5f409aa8 100644
--- a/fractal-matrix-api/src/backend/register.rs
+++ b/fractal-matrix-api/src/backend/register.rs
@@ -125,15 +125,10 @@ pub fn login(bk: &Backend, user: String, password: String, server: Url, id_url:
 pub fn logout(server: Url, access_token: AccessToken) -> Result<(), Error> {
     let params = LogoutParameters { access_token };
 
-    logout_req(server, &params)
-        .map_err(Into::into)
-        .and_then(|request| {
-            HTTP_CLIENT
-                .get_client()?
-                .execute(request)
-                .map_err(Into::into)
-        })
-        .and(Ok(()))
+    let request = logout_req(server, &params)?;
+    HTTP_CLIENT.get_client()?.execute(request)?;
+
+    Ok(())
 }
 
 pub fn register(bk: &Backend, user: String, password: String, server: Url, id_url: Url) {
@@ -176,11 +171,11 @@ pub fn register(bk: &Backend, user: String, password: String, server: Url, id_ur
 }
 
 pub fn get_well_known(domain: Url) -> Result<DomainInfoResponse, Error> {
-    domain_info(domain).map_err(Into::into).and_then(|request| {
-        HTTP_CLIENT
-            .get_client()?
-            .execute(request)?
-            .json::<DomainInfoResponse>()
-            .map_err(Into::into)
-    })
+    let request = domain_info(domain)?;
+
+    HTTP_CLIENT
+        .get_client()?
+        .execute(request)?
+        .json()
+        .map_err(Into::into)
 }
diff --git a/fractal-matrix-api/src/backend/room.rs b/fractal-matrix-api/src/backend/room.rs
index 8e2b1e7f..cbe76b07 100644
--- a/fractal-matrix-api/src/backend/room.rs
+++ b/fractal-matrix-api/src/backend/room.rs
@@ -1,4 +1,4 @@
-use log::{error, info};
+use log::error;
 use serde_json::json;
 
 use ruma_identifiers::{Error as IdError, RoomId, RoomIdOrAliasId, UserId};
@@ -115,19 +115,13 @@ fn get_room_detail(
 ) -> Result<(RoomId, String, String), Error> {
     let params = GetStateEventsForKeyParameters { access_token };
 
-    get_state_events_for_key(base, &params, &room_id, &keys)
-        .map_err(Into::into)
-        .and_then(|request| {
-            let response = HTTP_CLIENT
-                .get_client()?
-                .execute(request)?
-                .json::<JsonValue>()?;
+    let request = get_state_events_for_key(base, &params, &room_id, &keys)?;
+    let response: JsonValue = HTTP_CLIENT.get_client()?.execute(request)?.json()?;
 
-            let k = keys.split('.').last().unwrap();
-            let value = response[&k].as_str().map(Into::into).unwrap_or_default();
+    let k = keys.split('.').last().ok_or(Error::BackendError)?;
+    let value = response[&k].as_str().map(Into::into).unwrap_or_default();
 
-            Ok((room_id, keys, value))
-        })
+    Ok((room_id, keys, value))
 }
 
 pub fn get_room_avatar(
@@ -171,18 +165,12 @@ pub fn get_room_members(
 ) -> Result<(RoomId, Vec<Member>), Error> {
     let params = JoinedMembersParameters { access_token };
 
-    get_joined_members(base, &room_id, &params)
-        .map_err(Into::into)
-        .and_then(|request| {
-            let response = HTTP_CLIENT
-                .get_client()?
-                .execute(request)?
-                .json::<JoinedMembersResponse>()?;
+    let request = get_joined_members(base, &room_id, &params)?;
+    let response: JoinedMembersResponse = HTTP_CLIENT.get_client()?.execute(request)?.json()?;
 
-            let ms = response.joined.into_iter().map(Member::from).collect();
+    let ms = response.joined.into_iter().map(Member::from).collect();
 
-            Ok((room_id, ms))
-        })
+    Ok((room_id, ms))
 }
 
 /* Load older messages starting by prev_batch
@@ -206,20 +194,14 @@ pub fn get_room_messages(
         },
     };
 
-    get_messages_events(base, &params, &room_id)
-        .map_err(Into::into)
-        .and_then(|request| {
-            let response = HTTP_CLIENT
-                .get_client()?
-                .execute(request)?
-                .json::<GetMessagesEventsResponse>()?;
+    let request = get_messages_events(base, &params, &room_id)?;
+    let response: GetMessagesEventsResponse = HTTP_CLIENT.get_client()?.execute(request)?.json()?;
 
-            let prev_batch = response.end;
-            let evs = response.chunk.iter().rev();
-            Message::from_json_events_iter(&room_id, evs)
-                .map(|list| (list, room_id, prev_batch))
-                .map_err(Into::into)
-        })
+    let prev_batch = response.end;
+    let evs = response.chunk.iter().rev();
+    let list = Message::from_json_events_iter(&room_id, evs)?;
+
+    Ok((list, room_id, prev_batch))
 }
 
 pub fn get_room_messages_from_msg(
@@ -230,8 +212,9 @@ pub fn get_room_messages_from_msg(
 ) -> Result<(Vec<Message>, RoomId, Option<String>), Error> {
     // first of all, we calculate the from param using the context api, then we call the
     // normal get_room_messages
-    get_prev_batch_from(base.clone(), access_token.clone(), &room_id, &msg.id)
-        .and_then(|from| get_room_messages(base, access_token, room_id, from))
+    let from = get_prev_batch_from(base.clone(), access_token.clone(), &room_id, &msg.id)?;
+
+    get_room_messages(base, access_token, room_id, from)
 }
 
 pub fn send_msg(
@@ -291,16 +274,10 @@ pub fn send_typing(
     let params = TypingNotificationParameters { access_token };
     let body = TypingNotificationBody::Typing(Duration::from_secs(4));
 
-    info!("Sending typing notification");
-    send_typing_notification(base, &room_id, &user_id, &params, &body)
-        .map_err(Into::into)
-        .and_then(|request| {
-            HTTP_CLIENT
-                .get_client()?
-                .execute(request)
-                .map_err(Into::into)
-        })
-        .and(Ok(()))
+    let request = send_typing_notification(base, &room_id, &user_id, &params, &body)?;
+    HTTP_CLIENT.get_client()?.execute(request)?;
+
+    Ok(())
 }
 
 pub fn redact_msg(
@@ -363,13 +340,10 @@ pub fn join_room(bk: &Backend, base: Url, access_token: AccessToken, room_id: Ro
 pub fn leave_room(base: Url, access_token: AccessToken, room_id: RoomId) -> Result<(), Error> {
     let params = LeaveRoomParameters { access_token };
 
-    leave_room_req(base, &room_id, &params)
-        .map_err(Into::into)
-        .and_then(|request| {
-            let _ = HTTP_CLIENT.get_client()?.execute(request)?;
+    let request = leave_room_req(base, &room_id, &params)?;
+    HTTP_CLIENT.get_client()?.execute(request)?;
 
-            Ok(())
-        })
+    Ok(())
 }
 
 pub fn mark_as_read(
@@ -385,13 +359,10 @@ pub fn mark_as_read(
         read: Some(event_id.clone()),
     };
 
-    set_read_marker(base, &params, &body, &room_id)
-        .map_err(Into::into)
-        .and_then(|request| {
-            let _ = HTTP_CLIENT.get_client()?.execute(request)?;
+    let request = set_read_marker(base, &params, &body, &room_id)?;
+    HTTP_CLIENT.get_client()?.execute(request)?;
 
-            Ok((room_id, event_id))
-        })
+    Ok((room_id, event_id))
 }
 
 pub fn set_room_name(
@@ -406,13 +377,10 @@ pub fn set_room_name(
         "name": name,
     });
 
-    create_state_events_for_key(base, &params, &body, &room_id, "m.room.name")
-        .map_err(Into::into)
-        .and_then(|request| {
-            let _ = HTTP_CLIENT.get_client()?.execute(request)?;
+    let request = create_state_events_for_key(base, &params, &body, &room_id, "m.room.name")?;
+    HTTP_CLIENT.get_client()?.execute(request)?;
 
-            Ok(())
-        })
+    Ok(())
 }
 
 pub fn set_room_topic(
@@ -427,13 +395,10 @@ pub fn set_room_topic(
         "topic": topic,
     });
 
-    create_state_events_for_key(base, &params, &body, &room_id, "m.room.topic")
-        .map_err(Into::into)
-        .and_then(|request| {
-            let _ = HTTP_CLIENT.get_client()?.execute(request)?;
+    let request = create_state_events_for_key(base, &params, &body, &room_id, "m.room.topic")?;
+    HTTP_CLIENT.get_client()?.execute(request)?;
 
-            Ok(())
-        })
+    Ok(())
 }
 
 pub fn set_room_avatar(
@@ -446,13 +411,13 @@ pub fn set_room_avatar(
         access_token: access_token.clone(),
     };
 
-    upload_file(base.clone(), access_token, &avatar).and_then(|response| {
-        let body = json!({ "url": response.content_uri.as_str() });
-        let request = create_state_events_for_key(base, &params, &body, &room_id, "m.room.avatar")?;
-        let _ = HTTP_CLIENT.get_client()?.execute(request)?;
+    let upload_file_response = upload_file(base.clone(), access_token, &avatar)?;
 
-        Ok(())
-    })
+    let body = json!({ "url": upload_file_response.content_uri.as_str() });
+    let request = create_state_events_for_key(base, &params, &body, &room_id, "m.room.avatar")?;
+    HTTP_CLIENT.get_client()?.execute(request)?;
+
+    Ok(())
 }
 
 pub fn attach_file(
@@ -532,16 +497,13 @@ fn upload_file(
     };
 
     let contents = fs::read(fname)?;
+    let request = create_content(base, &params_upload, contents)?;
 
-    create_content(base, &params_upload, contents)
-        .map_err::<Error, _>(Into::into)
-        .and_then(|request| {
-            HTTP_CLIENT
-                .get_client()?
-                .execute(request)?
-                .json::<CreateContentResponse>()
-                .map_err(Into::into)
-        })
+    HTTP_CLIENT
+        .get_client()?
+        .execute(request)?
+        .json()
+        .map_err(Into::into)
 }
 
 pub fn new_room(
@@ -564,19 +526,13 @@ pub fn new_room(
         ..Default::default()
     };
 
-    create_room(base, &params, &body)
-        .map_err(Into::into)
-        .and_then(|request| {
-            let response = HTTP_CLIENT
-                .get_client()?
-                .execute(request)?
-                .json::<CreateRoomResponse>()?;
+    let request = create_room(base, &params, &body)?;
+    let response: CreateRoomResponse = HTTP_CLIENT.get_client()?.execute(request)?.json()?;
 
-            Ok(Room {
-                name: Some(name),
-                ..Room::new(response.room_id, RoomMembership::Joined(RoomTag::None))
-            })
-        })
+    Ok(Room {
+        name: Some(name),
+        ..Room::new(response.room_id, RoomMembership::Joined(RoomTag::None))
+    })
 }
 
 fn update_direct_chats(
@@ -671,29 +627,23 @@ pub fn direct_chat(
         ..Default::default()
     };
 
-    create_room(base.clone(), &params, &body)
-        .map_err(Into::into)
-        .and_then(|request| {
-            let response = HTTP_CLIENT
-                .get_client()?
-                .execute(request)?
-                .json::<CreateRoomResponse>()?;
-
-            update_direct_chats(
-                data,
-                base,
-                access_token,
-                user_id,
-                response.room_id.clone(),
-                user.clone(),
-            );
-
-            Ok(Room {
-                name: user.alias.clone(),
-                direct: true,
-                ..Room::new(response.room_id, RoomMembership::Joined(RoomTag::None))
-            })
-        })
+    let request = create_room(base.clone(), &params, &body)?;
+    let response: CreateRoomResponse = HTTP_CLIENT.get_client()?.execute(request)?.json()?;
+
+    update_direct_chats(
+        data,
+        base,
+        access_token,
+        user_id,
+        response.room_id.clone(),
+        user.clone(),
+    );
+
+    Ok(Room {
+        name: user.alias.clone(),
+        direct: true,
+        ..Room::new(response.room_id, RoomMembership::Joined(RoomTag::None))
+    })
 }
 
 pub fn add_to_fav(
@@ -703,24 +653,18 @@ pub fn add_to_fav(
     room_id: RoomId,
     tofav: bool,
 ) -> Result<(RoomId, bool), Error> {
-    let request_res = if tofav {
+    let request = if tofav {
         let params = CreateTagParameters { access_token };
         let body = CreateTagBody { order: Some(0.5) };
         create_tag(base, &user_id, &room_id, "m.favourite", &params, &body)
     } else {
         let params = DeleteTagParameters { access_token };
         delete_tag(base, &user_id, &room_id, "m.favourite", &params)
-    };
+    }?;
 
-    request_res
-        .map_err(Into::into)
-        .and_then(|request| {
-            HTTP_CLIENT
-                .get_client()?
-                .execute(request)
-                .map_err(Into::into)
-        })
-        .and(Ok((room_id, tofav)))
+    HTTP_CLIENT.get_client()?.execute(request)?;
+
+    Ok((room_id, tofav))
 }
 
 pub fn invite(
@@ -732,13 +676,10 @@ pub fn invite(
     let params = InviteUserParameters { access_token };
     let body = InviteUserBody { user_id };
 
-    invite_user(base, &room_id, &params, &body)
-        .map_err(Into::into)
-        .and_then(|request| {
-            let _ = HTTP_CLIENT.get_client()?.execute(request)?;
+    let request = invite_user(base, &room_id, &params, &body)?;
+    HTTP_CLIENT.get_client()?.execute(request)?;
 
-            Ok(())
-        })
+    Ok(())
 }
 
 pub fn set_language(
diff --git a/fractal-matrix-api/src/backend/user.rs b/fractal-matrix-api/src/backend/user.rs
index ba08ae6c..f6ff9035 100644
--- a/fractal-matrix-api/src/backend/user.rs
+++ b/fractal-matrix-api/src/backend/user.rs
@@ -67,16 +67,10 @@ use crate::r0::ThreePIDCredentials;
 use crate::types::Member;
 
 pub fn get_username(base: Url, uid: UserId) -> Result<Option<String>, Error> {
-    get_display_name(base, &uid)
-        .map_err(Into::into)
-        .and_then(|request| {
-            HTTP_CLIENT
-                .get_client()?
-                .execute(request)?
-                .json::<GetDisplayNameResponse>()
-                .map_err(Into::into)
-        })
-        .map(|response| response.displayname)
+    let request = get_display_name(base, &uid)?;
+    let response: GetDisplayNameResponse = HTTP_CLIENT.get_client()?.execute(request)?.json()?;
+
+    Ok(response.displayname)
 }
 
 // FIXME: This function manages errors *really* wrong and isn't more async
@@ -107,15 +101,10 @@ pub fn set_username(
         displayname: Some(username.clone()),
     };
 
-    set_display_name(base, &params, &body, &uid)
-        .map_err(Into::into)
-        .and_then(|request| {
-            HTTP_CLIENT
-                .get_client()?
-                .execute(request)
-                .map_err(Into::into)
-        })
-        .and(Ok(username))
+    let request = set_display_name(base, &params, &body, &uid)?;
+    HTTP_CLIENT.get_client()?.execute(request)?;
+
+    Ok(username)
 }
 
 pub fn get_threepid(
@@ -124,16 +113,10 @@ pub fn get_threepid(
 ) -> Result<Vec<ThirdPartyIdentifier>, Error> {
     let params = ThirdPartyIDParameters { access_token };
 
-    get_identifiers(base, &params)
-        .map_err(Into::into)
-        .and_then(|request| {
-            HTTP_CLIENT
-                .get_client()?
-                .execute(request)?
-                .json::<ThirdPartyIDResponse>()
-                .map_err(Into::into)
-        })
-        .map(|response| response.threepids)
+    let request = get_identifiers(base, &params)?;
+    let response: ThirdPartyIDResponse = HTTP_CLIENT.get_client()?.execute(request)?.json()?;
+
+    Ok(response.threepids)
 }
 
 pub fn get_email_token(
@@ -143,6 +126,8 @@ pub fn get_email_token(
     email: String,
     client_secret: String,
 ) -> Result<(String, String), Error> {
+    use EmailTokenResponse::*;
+
     let params = EmailTokenParameters { access_token };
     let body = EmailTokenBody {
         id_server: identity.try_into()?,
@@ -152,26 +137,17 @@ pub fn get_email_token(
         next_link: None,
     };
 
-    request_contact_verification_token_email(base, &params, &body)
-        .map_err(Into::into)
-        .and_then(|request| {
-            HTTP_CLIENT
-                .get_client()?
-                .execute(request)?
-                .json::<EmailTokenResponse>()
-                .map_err(Into::into)
-        })
-        .and_then(|response| match response {
-            EmailTokenResponse::Passed(info) => Ok(info.sid),
-            EmailTokenResponse::Failed(info) => {
-                if info.errcode == "M_THREEPID_IN_USE" {
-                    Err(Error::TokenUsed)
-                } else {
-                    Err(Error::Denied)
-                }
-            }
-        })
-        .map(|response| (response, client_secret))
+    let request = request_contact_verification_token_email(base, &params, &body)?;
+
+    match HTTP_CLIENT
+        .get_client()?
+        .execute(request)?
+        .json::<EmailTokenResponse>()?
+    {
+        Passed(info) => Ok((info.sid, client_secret)),
+        Failed(info) if info.errcode == "M_THREEPID_IN_USE" => Err(Error::TokenUsed),
+        Failed(_) => Err(Error::Denied),
+    }
 }
 
 pub fn get_phone_token(
@@ -181,6 +157,8 @@ pub fn get_phone_token(
     phone: String,
     client_secret: String,
 ) -> Result<(String, String), Error> {
+    use PhoneTokenResponse::*;
+
     let params = PhoneTokenParameters { access_token };
     let body = PhoneTokenBody {
         id_server: identity.try_into()?,
@@ -191,26 +169,17 @@ pub fn get_phone_token(
         next_link: None,
     };
 
-    request_contact_verification_token_msisdn(base, &params, &body)
-        .map_err(Into::into)
-        .and_then(|request| {
-            HTTP_CLIENT
-                .get_client()?
-                .execute(request)?
-                .json::<PhoneTokenResponse>()
-                .map_err(Into::into)
-        })
-        .and_then(|response| match response {
-            PhoneTokenResponse::Passed(info) => Ok(info.sid),
-            PhoneTokenResponse::Failed(info) => {
-                if info.errcode == "M_THREEPID_IN_USE" {
-                    Err(Error::TokenUsed)
-                } else {
-                    Err(Error::Denied)
-                }
-            }
-        })
-        .map(|response| (response, client_secret))
+    let request = request_contact_verification_token_msisdn(base, &params, &body)?;
+
+    match HTTP_CLIENT
+        .get_client()?
+        .execute(request)?
+        .json::<PhoneTokenResponse>()?
+    {
+        Passed(info) => Ok((info.sid, client_secret)),
+        Failed(info) if info.errcode == "M_THREEPID_IN_USE" => Err(Error::TokenUsed),
+        Failed(_) => Err(Error::Denied),
+    }
 }
 
 pub fn add_threepid(
@@ -230,15 +199,10 @@ pub fn add_threepid(
         bind: true,
     };
 
-    create_contact(base, &params, &body)
-        .map_err(Into::into)
-        .and_then(|request| {
-            HTTP_CLIENT
-                .get_client()?
-                .execute(request)
-                .map_err(Into::into)
-        })
-        .and(Ok(()))
+    let request = create_contact(base, &params, &body)?;
+    HTTP_CLIENT.get_client()?.execute(request)?;
+
+    Ok(())
 }
 
 pub fn submit_phone_token(
@@ -253,16 +217,10 @@ pub fn submit_phone_token(
         token,
     };
 
-    submit_phone_token_req(base, &body)
-        .map_err(Into::into)
-        .and_then(|request| {
-            HTTP_CLIENT
-                .get_client()?
-                .execute(request)?
-                .json::<SubmitPhoneTokenResponse>()
-                .map_err(Into::into)
-        })
-        .map(|response| (Some(sid).filter(|_| response.success), client_secret))
+    let request = submit_phone_token_req(base, &body)?;
+    let response: SubmitPhoneTokenResponse = HTTP_CLIENT.get_client()?.execute(request)?.json()?;
+
+    Ok((Some(sid).filter(|_| response.success), client_secret))
 }
 
 pub fn delete_three_pid(
@@ -274,15 +232,10 @@ pub fn delete_three_pid(
     let params = DeleteThreePIDParameters { access_token };
     let body = DeleteThreePIDBody { address, medium };
 
-    delete_contact(base, &params, &body)
-        .map_err(Into::into)
-        .and_then(|request| {
-            HTTP_CLIENT
-                .get_client()?
-                .execute(request)
-                .map_err(Into::into)
-        })
-        .and(Ok(()))
+    let request = delete_contact(base, &params, &body)?;
+    HTTP_CLIENT.get_client()?.execute(request)?;
+
+    Ok(())
 }
 
 pub fn change_password(
@@ -302,15 +255,10 @@ pub fn change_password(
         }),
     };
 
-    change_password_req(base, &params, &body)
-        .map_err(Into::into)
-        .and_then(|request| {
-            HTTP_CLIENT
-                .get_client()?
-                .execute(request)
-                .map_err(Into::into)
-        })
-        .and(Ok(()))
+    let request = change_password_req(base, &params, &body)?;
+    HTTP_CLIENT.get_client()?.execute(request)?;
+
+    Ok(())
 }
 
 pub fn account_destruction(
@@ -328,15 +276,10 @@ pub fn account_destruction(
         }),
     };
 
-    deactivate(base, &params, &body)
-        .map_err(Into::into)
-        .and_then(|request| {
-            HTTP_CLIENT
-                .get_client()?
-                .execute(request)
-                .map_err(Into::into)
-        })
-        .and(Ok(()))
+    let request = deactivate(base, &params, &body)?;
+    HTTP_CLIENT.get_client()?.execute(request)?;
+
+    Ok(())
 }
 
 pub fn get_avatar(base: Url, userid: UserId) -> Result<PathBuf, Error> {
@@ -368,34 +311,20 @@ pub fn set_user_avatar(
         filename: None,
     };
 
-    fs::read(&avatar)
-        .map_err(Into::into)
-        .and_then(|contents| {
-            let upload_response = create_content(base.clone(), &params_upload, contents)
-                .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, &params_avatar, &body, &uid)
-                .map_err(Into::into)
-                .and_then(|request| {
-                    HTTP_CLIENT
-                        .get_client()?
-                        .execute(request)
-                        .map_err(Into::into)
-                })
-        })
-        .and(Ok(avatar))
+    let contents = fs::read(&avatar)?;
+    let request = create_content(base.clone(), &params_upload, contents)?;
+    let upload_response: CreateContentResponse =
+        HTTP_CLIENT.get_client()?.execute(request)?.json()?;
+
+    let params_avatar = SetAvatarUrlParameters { access_token };
+    let body = SetAvatarUrlBody {
+        avatar_url: Some(upload_response.content_uri),
+    };
+
+    let request = set_avatar_url(base, &params_avatar, &body, &uid)?;
+    HTTP_CLIENT.get_client()?.execute(request)?;
+
+    Ok(avatar)
 }
 
 pub fn get_user_info_async(
@@ -442,19 +371,14 @@ pub fn search(
         ..Default::default()
     };
 
-    user_directory(base, &params, &body)
-        .map_err(Into::into)
-        .and_then(|request| {
-            HTTP_CLIENT
-                .get_client()?
-                .execute(request)?
-                .json::<UserDirectoryResponse>()
-                .map_err(Into::into)
-        })
-        .map(|response| response.results.into_iter().map(Into::into).collect())
+    let request = user_directory(base, &params, &body)?;
+    let response: UserDirectoryResponse = HTTP_CLIENT.get_client()?.execute(request)?.json()?;
+
+    Ok(response.results.into_iter().map(Into::into).collect())
 }
 
 fn get_user_avatar_img(baseu: Url, userid: &UserId, avatar: &str) -> Result<String, Error> {
     let dest = cache_dir_path(None, &userid.to_string())?;
+
     dw_media(baseu, avatar, ContentType::default_thumbnail(), Some(dest))
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]