[fractal] fractal-matrix-api: Don't pass by value unnecessarily



commit 2ab29cfe69422887a1cafe82b68d6fbed26814c0
Author: Zeeshan Ali <zeenix collabora co uk>
Date:   Wed Dec 12 23:05:44 2018 +0100

    fractal-matrix-api: Don't pass by value unnecessarily
    
    This patch fixes a big bunch of 'unnecessary pass by value' errors from clippy:
    
    ```
    error: this argument is passed by value, but not consumed in the function body
       --> fractal-matrix-api/src/util.rs:340:9
        |
    340 |     tk: String,
        |         ^^^^^^
        |
        = note: `-D clippy::needless-pass-by-value` implied by `-D warnings`
        = help: for further information visit 
https://rust-lang-nursery.github.io/rust-clippy/master/index.html#needless_pass_by_value
    help: consider changing the type to
        |
    340 |     tk: &str,
        |         ^^^^
    help: change `tk.clone()` to
        |
    357 |                 tk.to_string(),
        |                 ^^^^^^^^^^^^^^
    ```
    
    Related: #370

 fractal-matrix-api/src/backend/directory.rs |  2 +-
 fractal-matrix-api/src/backend/media.rs     |  9 +--
 fractal-matrix-api/src/backend/mod.rs       | 52 ++++++++---------
 fractal-matrix-api/src/backend/register.rs  | 31 +++++-----
 fractal-matrix-api/src/backend/room.rs      | 87 +++++++++++++----------------
 fractal-matrix-api/src/backend/stickers.rs  | 36 ++++++------
 fractal-matrix-api/src/backend/sync.rs      |  4 +-
 fractal-matrix-api/src/backend/types.rs     |  2 +-
 fractal-matrix-api/src/backend/user.rs      | 58 +++++++++----------
 fractal-matrix-api/src/model/message.rs     |  6 +-
 fractal-matrix-api/src/util.rs              | 73 +++++++++++-------------
 11 files changed, 171 insertions(+), 189 deletions(-)
---
diff --git a/fractal-matrix-api/src/backend/directory.rs b/fractal-matrix-api/src/backend/directory.rs
index 78cbaaf..4b6eda2 100644
--- a/fractal-matrix-api/src/backend/directory.rs
+++ b/fractal-matrix-api/src/backend/directory.rs
@@ -76,7 +76,7 @@ pub fn room_search(
         params.push(("server", hs));
     }
 
-    let url = bk.url("publicRooms", params)?;
+    let url = bk.url("publicRooms", &params)?;
     let base = bk.get_base_url()?;
 
     let mut attrs = json!({ "limit": globals::ROOM_DIRECTORY_LIMIT });
diff --git a/fractal-matrix-api/src/backend/media.rs b/fractal-matrix-api/src/backend/media.rs
index fb9bd5a..ffb1ebe 100644
--- a/fractal-matrix-api/src/backend/media.rs
+++ b/fractal-matrix-api/src/backend/media.rs
@@ -51,21 +51,22 @@ pub fn get_media_async(bk: &Backend, media: String, tx: Sender<String>) -> Resul
 
 pub fn get_media_list_async(
     bk: &Backend,
-    roomid: String,
+    roomid: &str,
     first_media_id: Option<String>,
     prev_batch: Option<String>,
     tx: Sender<(Vec<Message>, String)>,
 ) -> Result<(), Error> {
     let baseu = bk.get_base_url()?;
     let tk = bk.data.lock().unwrap().access_token.clone();
+    let room = String::from(roomid);
 
     semaphore(bk.limit_threads.clone(), move || match get_room_media_list(
         &baseu,
-        tk,
-        roomid.clone(),
+        &tk,
+        &room,
         globals::PAGE_LIMIT,
         first_media_id,
-        prev_batch,
+        &prev_batch,
     ) {
         Ok(media_list) => {
             tx.send(media_list).unwrap();
diff --git a/fractal-matrix-api/src/backend/mod.rs b/fractal-matrix-api/src/backend/mod.rs
index 56f349f..d498c45 100644
--- a/fractal-matrix-api/src/backend/mod.rs
+++ b/fractal-matrix-api/src/backend/mod.rs
@@ -58,14 +58,14 @@ impl Backend {
         Ok(url)
     }
 
-    fn url(&self, path: &str, params: Vec<(&str, String)>) -> Result<Url, Error> {
+    fn url(&self, path: &str, params: &[(&str, String)]) -> Result<Url, Error> {
         let base = self.get_base_url()?;
         let tk = self.data.lock().unwrap().access_token.clone();
 
         let mut params2 = params.to_vec();
         params2.push(("access_token", tk.clone()));
 
-        client_url(&base, path, params2)
+        client_url(&base, path, &params2)
     }
 
     pub fn run(mut self) -> Sender<BKCommand> {
@@ -88,7 +88,7 @@ impl Backend {
         match cmd {
             // Register module
             Ok(BKCommand::Login(user, passwd, server)) => {
-                let r = register::login(self, user, passwd, server);
+                let r = register::login(self, &user, &passwd, &server);
                 bkerror!(r, tx, BKResponse::LoginError);
             }
             Ok(BKCommand::Logout) => {
@@ -96,15 +96,15 @@ impl Backend {
                 bkerror!(r, tx, BKResponse::LogoutError);
             }
             Ok(BKCommand::Register(user, passwd, server)) => {
-                let r = register::register(self, user, passwd, server);
+                let r = register::register(self, &user, &passwd, &server);
                 bkerror!(r, tx, BKResponse::LoginError);
             }
             Ok(BKCommand::Guest(server)) => {
-                let r = register::guest(self, server);
+                let r = register::guest(self, &server);
                 bkerror!(r, tx, BKResponse::GuestLoginError);
             }
             Ok(BKCommand::SetToken(token, uid, server)) => {
-                let r = register::set_token(self, token, uid, server);
+                let r = register::set_token(self, token, uid, &server);
                 bkerror!(r, tx, BKResponse::LoginError);
             }
 
@@ -122,31 +122,31 @@ impl Backend {
                 bkerror!(r, tx, BKResponse::GetThreePIDError);
             }
             Ok(BKCommand::GetTokenEmail(identity, email, client_secret)) => {
-                let r = user::get_email_token(self, identity, email, client_secret);
+                let r = user::get_email_token(self, &identity, &email, client_secret);
                 bkerror!(r, tx, BKResponse::GetTokenEmailError);
             }
             Ok(BKCommand::GetTokenPhone(identity, phone, client_secret)) => {
-                let r = user::get_phone_token(self, identity, phone, client_secret);
+                let r = user::get_phone_token(self, &identity, &phone, client_secret);
                 bkerror!(r, tx, BKResponse::GetTokenEmailError);
             }
             Ok(BKCommand::SubmitPhoneToken(identity, client_secret, sid, token)) => {
-                let r = user::submit_phone_token(self, identity, client_secret, sid, token);
+                let r = user::submit_phone_token(self, &identity, client_secret, sid, token);
                 bkerror!(r, tx, BKResponse::SubmitPhoneTokenError);
             }
             Ok(BKCommand::AddThreePID(identity, client_secret, sid)) => {
-                let r = user::add_threepid(self, identity, client_secret, sid);
+                let r = user::add_threepid(self, &identity, &client_secret, sid);
                 bkerror!(r, tx, BKResponse::AddThreePIDError);
             }
             Ok(BKCommand::DeleteThreePID(medium, address)) => {
-                let r = user::delete_three_pid(self, medium, address);
+                let r = user::delete_three_pid(self, &medium, &address);
                 bkerror!(r, tx, BKResponse::DeleteThreePIDError);
             }
             Ok(BKCommand::ChangePassword(username, old_password, new_password)) => {
-                let r = user::change_password(self, username, old_password, new_password);
+                let r = user::change_password(self, &username, &old_password, &new_password);
                 bkerror!(r, tx, BKResponse::ChangePasswordError);
             }
             Ok(BKCommand::AccountDestruction(username, password, flag)) => {
-                let r = user::account_destruction(self, username, password, flag);
+                let r = user::account_destruction(self, &username, &password, flag);
                 bkerror!(r, tx, BKResponse::AccountDestructionError);
             }
             Ok(BKCommand::GetAvatar) => {
@@ -170,7 +170,7 @@ impl Backend {
                 bkerror!(r, tx, BKResponse::CommandError);
             }
             Ok(BKCommand::UserSearch(term)) => {
-                let r = user::search(self, term);
+                let r = user::search(self, &term);
                 bkerror!(r, tx, BKResponse::CommandError);
             }
 
@@ -206,7 +206,7 @@ impl Backend {
                 bkerror!(r, tx, BKResponse::SendMsgError);
             }
             Ok(BKCommand::SendMsgRedaction(msg)) => {
-                let r = room::redact_msg(self, msg);
+                let r = room::redact_msg(self, &msg);
                 bkerror!(r, tx, BKResponse::SendMsgRedactionError);
             }
             Ok(BKCommand::SetRoom(id)) => {
@@ -222,23 +222,23 @@ impl Backend {
                 bkerror!(r, tx, BKResponse::JoinRoomError);
             }
             Ok(BKCommand::LeaveRoom(roomid)) => {
-                let r = room::leave_room(self, roomid);
+                let r = room::leave_room(self, &roomid);
                 bkerror!(r, tx, BKResponse::LeaveRoomError);
             }
             Ok(BKCommand::MarkAsRead(roomid, evid)) => {
-                let r = room::mark_as_read(self, roomid, evid);
+                let r = room::mark_as_read(self, &roomid, &evid);
                 bkerror!(r, tx, BKResponse::MarkAsReadError);
             }
             Ok(BKCommand::SetRoomName(roomid, name)) => {
-                let r = room::set_room_name(self, roomid, name);
+                let r = room::set_room_name(self, &roomid, &name);
                 bkerror!(r, tx, BKResponse::SetRoomNameError);
             }
             Ok(BKCommand::SetRoomTopic(roomid, topic)) => {
-                let r = room::set_room_topic(self, roomid, topic);
+                let r = room::set_room_topic(self, &roomid, &topic);
                 bkerror!(r, tx, BKResponse::SetRoomTopicError);
             }
             Ok(BKCommand::SetRoomAvatar(roomid, fname)) => {
-                let r = room::set_room_avatar(self, roomid, fname);
+                let r = room::set_room_avatar(self, &roomid, &fname);
                 bkerror!(r, tx, BKResponse::SetRoomAvatarError);
             }
             Ok(BKCommand::AttachFile(msg)) => {
@@ -246,13 +246,13 @@ impl Backend {
                 bkerror!(r, tx, BKResponse::AttachFileError);
             }
             Ok(BKCommand::NewRoom(name, privacy, internalid)) => {
-                let r = room::new_room(self, name, privacy, internalid.clone());
+                let r = room::new_room(self, &name, privacy, internalid.clone());
                 if let Err(e) = r {
                     tx.send(BKResponse::NewRoomError(e, internalid)).unwrap();
                 }
             }
             Ok(BKCommand::DirectChat(user, internalid)) => {
-                let r = room::direct_chat(self, user, internalid.clone());
+                let r = room::direct_chat(self, &user, internalid.clone());
                 if let Err(e) = r {
                     tx.send(BKResponse::NewRoomError(e, internalid)).unwrap();
                 }
@@ -266,11 +266,11 @@ impl Backend {
                 bkerror!(r, tx, BKResponse::AcceptInvError);
             }
             Ok(BKCommand::RejectInv(roomid)) => {
-                let r = room::leave_room(self, roomid);
+                let r = room::leave_room(self, &roomid);
                 bkerror!(r, tx, BKResponse::RejectInvError);
             }
             Ok(BKCommand::Invite(room, userid)) => {
-                let r = room::invite(self, room, userid);
+                let r = room::invite(self, &room, &userid);
                 bkerror!(r, tx, BKResponse::InviteError);
             }
 
@@ -284,7 +284,7 @@ impl Backend {
                 bkerror!(r, tx, BKResponse::CommandError);
             }
             Ok(BKCommand::GetMediaListAsync(roomid, first_media_id, prev_batch, ctx)) => {
-                let r = media::get_media_list_async(self, roomid, first_media_id, prev_batch, ctx);
+                let r = media::get_media_list_async(self, &roomid, first_media_id, prev_batch, ctx);
                 bkerror!(r, tx, BKResponse::CommandError);
             }
             Ok(BKCommand::GetMedia(media)) => {
@@ -331,7 +331,7 @@ impl Backend {
                 bkerror!(r, tx, BKResponse::StickersError);
             }
             Ok(BKCommand::SendSticker(room, sticker)) => {
-                let r = stickers::send(self, room, &sticker);
+                let r = stickers::send(self, &room, &sticker);
                 bkerror!(r, tx, BKResponse::StickersError);
             }
             Ok(BKCommand::PurchaseSticker(group)) => {
diff --git a/fractal-matrix-api/src/backend/register.rs b/fractal-matrix-api/src/backend/register.rs
index eb6b3f0..d1fa20d 100644
--- a/fractal-matrix-api/src/backend/register.rs
+++ b/fractal-matrix-api/src/backend/register.rs
@@ -11,12 +11,11 @@ use util::json_q;
 use backend::types::BKResponse;
 use backend::types::Backend;
 
-pub fn guest(bk: &Backend, server: String) -> Result<(), Error> {
-    let s = server.clone();
-    let url = Url::parse(&s)
+pub fn guest(bk: &Backend, server: &str) -> Result<(), Error> {
+    let url = Url::parse(server)
         .unwrap()
         .join("/_matrix/client/r0/register?kind=guest")?;
-    bk.data.lock().unwrap().server_url = s;
+    bk.data.lock().unwrap().server_url = String::from(server);
 
     let data = bk.data.clone();
     let tx = bk.tx.clone();
@@ -40,7 +39,7 @@ pub fn guest(bk: &Backend, server: String) -> Result<(), Error> {
     Ok(())
 }
 
-fn build_login_attrs(user: String, password: String) -> Result<JsonValue, Error> {
+fn build_login_attrs(user: &str, password: &str) -> Result<JsonValue, Error> {
     let emailre = Regex::new(
         r"^([0-9a-zA-Z]([-\.\w]*[0-9a-zA-Z])+@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$",
     )?;
@@ -53,11 +52,11 @@ fn build_login_attrs(user: String, password: String) -> Result<JsonValue, Error>
             "password": password,
             "initial_device_display_name": "Fractal",
             "medium": "email",
-            "address": user.clone(),
+            "address": user,
             "identifier": {
                 "type": "m.id.thirdparty",
                 "medium": "email",
-                "address": user.clone()
+                "address": user,
             }
         });
     } else {
@@ -72,10 +71,10 @@ fn build_login_attrs(user: String, password: String) -> Result<JsonValue, Error>
     Ok(attrs)
 }
 
-pub fn login(bk: &Backend, user: String, password: String, server: String) -> Result<(), Error> {
-    let s = server.clone();
+pub fn login(bk: &Backend, user: &str, password: &str, server: &str) -> Result<(), Error> {
+    let s = String::from(server);
     bk.data.lock().unwrap().server_url = s;
-    let url = bk.url("login", vec![])?;
+    let url = bk.url("login", &[])?;
 
     let attrs = build_login_attrs(user, password)?;
     let data = bk.data.clone();
@@ -105,8 +104,8 @@ pub fn login(bk: &Backend, user: String, password: String, server: String) -> Re
     Ok(())
 }
 
-pub fn set_token(bk: &Backend, token: String, uid: String, server: String) -> Result<(), Error> {
-    let s = server.clone();
+pub fn set_token(bk: &Backend, token: String, uid: String, server: &str) -> Result<(), Error> {
+    let s = String::from(server);
     bk.data.lock().unwrap().server_url = s;
     bk.data.lock().unwrap().access_token = token.clone();
     bk.data.lock().unwrap().user_id = uid.clone();
@@ -117,7 +116,7 @@ pub fn set_token(bk: &Backend, token: String, uid: String, server: String) -> Re
 }
 
 pub fn logout(bk: &Backend) -> Result<(), Error> {
-    let url = bk.url("logout", vec![])?;
+    let url = bk.url("logout", &[])?;
     let attrs = json!({});
 
     let data = bk.data.clone();
@@ -136,10 +135,10 @@ pub fn logout(bk: &Backend) -> Result<(), Error> {
     Ok(())
 }
 
-pub fn register(bk: &Backend, user: String, password: String, server: String) -> Result<(), Error> {
-    let s = server.clone();
+pub fn register(bk: &Backend, user: &str, password: &str, server: &str) -> Result<(), Error> {
+    let s = String::from(server);
     bk.data.lock().unwrap().server_url = s;
-    let url = bk.url("register", vec![("kind", String::from("user"))])?;
+    let url = bk.url("register", &vec![("kind", String::from("user"))])?;
 
     let attrs = json!({
         "auth": {"type": "m.login.password"},
diff --git a/fractal-matrix-api/src/backend/room.rs b/fractal-matrix-api/src/backend/room.rs
index 552c384..6e9d5c1 100644
--- a/fractal-matrix-api/src/backend/room.rs
+++ b/fractal-matrix-api/src/backend/room.rs
@@ -38,7 +38,7 @@ pub fn set_room(bk: &Backend, id: String) -> Result<(), Error> {
 }
 
 pub fn get_room_detail(bk: &Backend, roomid: String, key: String) -> Result<(), Error> {
-    let url = bk.url(&format!("rooms/{}/state/{}", roomid, key), vec![])?;
+    let url = bk.url(&format!("rooms/{}/state/{}", roomid, key), &[])?;
 
     let tx = bk.tx.clone();
     let keys = key.clone();
@@ -60,7 +60,7 @@ pub fn get_room_avatar(bk: &Backend, roomid: String) -> Result<(), Error> {
     let userid = bk.data.lock().unwrap().user_id.clone();
     let baseu = bk.get_base_url()?;
     let tk = bk.data.lock().unwrap().access_token.clone();
-    let url = bk.url(&format!("rooms/{}/state/m.room.avatar", roomid), vec![])?;
+    let url = bk.url(&format!("rooms/{}/state/m.room.avatar", roomid), &[])?;
 
     let tx = bk.tx.clone();
     get!(
@@ -96,7 +96,7 @@ pub fn get_room_avatar(bk: &Backend, roomid: String) -> Result<(), Error> {
 }
 
 pub fn get_room_members(bk: &Backend, roomid: String) -> Result<(), Error> {
-    let url = bk.url(&format!("rooms/{}/joined_members", roomid), vec![])?;
+    let url = bk.url(&format!("rooms/{}/joined_members", roomid), &[])?;
 
     let tx = bk.tx.clone();
     get!(
@@ -132,14 +132,14 @@ pub fn get_room_messages(bk: &Backend, roomid: String, from: String) -> Result<(
             "{ \"types\": [\"m.room.message\", \"m.sticker\"] }".to_string(),
         ),
     ];
-    let url = bk.url(&format!("rooms/{}/messages", roomid), params)?;
+    let url = bk.url(&format!("rooms/{}/messages", roomid), &params)?;
     let tx = bk.tx.clone();
     get!(
         &url,
         |r: JsonValue| {
             let array = r["chunk"].as_array();
             let evs = array.unwrap().iter().rev();
-            let list = Message::from_json_events_iter(roomid.clone(), evs);
+            let list = Message::from_json_events_iter(&roomid, evs);
             let prev_batch = r["end"].as_str().map(String::from);
             tx.send(BKResponse::RoomMessagesTo(list, roomid, prev_batch))
                 .unwrap();
@@ -159,7 +159,7 @@ pub fn get_room_messages_from_msg(bk: &Backend, roomid: String, msg: Message) ->
     let tx = bk.internal_tx.clone();
 
     thread::spawn(move || {
-        if let Ok(from) = util::get_prev_batch_from(&baseu, tk, roomid.clone(), id) {
+        if let Ok(from) = util::get_prev_batch_from(&baseu, &tk, &roomid, &id) {
             if let Some(t) = tx {
                 t.send(BKCommand::GetRoomMessages(roomid, from)).unwrap();
             }
@@ -174,13 +174,13 @@ fn parse_context(
     tk: String,
     baseu: Url,
     roomid: String,
-    eid: String,
+    eid: &str,
     limit: i32,
 ) -> Result<(), Error> {
     let url = client_url(
         &baseu,
         &format!("rooms/{}/context/{}", roomid, eid),
-        vec![
+        &vec![
             ("limit", format!("{}", limit)),
             ("access_token", tk.clone()),
         ],
@@ -202,14 +202,14 @@ fn parse_context(
                     continue;
                 }
 
-                let m = Message::parse_room_message(roomid.clone(), msg);
+                let m = Message::parse_room_message(&roomid, msg);
                 ms.push(m);
             }
 
             if ms.len() == 0 && id.is_some() {
                 // there's no messages so we'll try with a bigger context
                 if let Err(err) =
-                    parse_context(tx.clone(), tk, baseu, roomid, id.unwrap(), limit * 2)
+                    parse_context(tx.clone(), tk, baseu, roomid, &id.unwrap(), limit * 2)
                 {
                     tx.send(BKResponse::RoomMessagesError(err)).unwrap();
                 }
@@ -231,7 +231,7 @@ pub fn get_message_context(bk: &Backend, msg: Message) -> Result<(), Error> {
     let msgid = msg.id.unwrap_or_default();
     let tk = bk.data.lock().unwrap().access_token.clone();
 
-    parse_context(tx, tk, baseu, roomid, msgid, globals::PAGE_LIMIT)?;
+    parse_context(tx, tk, baseu, roomid, &msgid, globals::PAGE_LIMIT)?;
 
     Ok(())
 }
@@ -240,10 +240,7 @@ pub fn send_msg(bk: &Backend, msg: Message) -> Result<(), Error> {
     let roomid = msg.room.clone();
 
     let id = msg.id.unwrap_or_default();
-    let url = bk.url(
-        &format!("rooms/{}/send/m.room.message/{}", roomid, id),
-        vec![],
-    )?;
+    let url = bk.url(&format!("rooms/{}/send/m.room.message/{}", roomid, id), &[])?;
 
     let mut attrs = json!({
         "body": msg.body.clone(),
@@ -285,15 +282,12 @@ pub fn send_msg(bk: &Backend, msg: Message) -> Result<(), Error> {
     Ok(())
 }
 
-pub fn redact_msg(bk: &Backend, msg: Message) -> Result<(), Error> {
+pub fn redact_msg(bk: &Backend, msg: &Message) -> Result<(), Error> {
     let roomid = msg.room.clone();
     let msgid = msg.id.clone().unwrap_or_default();
     let txnid = msg.get_txn_id();
 
-    let url = bk.url(
-        &format!("rooms/{}/redact/{}/{}", roomid, msgid, txnid),
-        vec![],
-    )?;
+    let url = bk.url(&format!("rooms/{}/redact/{}/{}", roomid, msgid, txnid), &[])?;
 
     let attrs = json!({
         "reason": "Deletion requested by the sender"
@@ -321,7 +315,7 @@ pub fn redact_msg(bk: &Backend, msg: Message) -> Result<(), Error> {
 }
 
 pub fn join_room(bk: &Backend, roomid: String) -> Result<(), Error> {
-    let url = bk.url(&format!("join/{}", urlencoding::encode(&roomid)), vec![])?;
+    let url = bk.url(&format!("join/{}", urlencoding::encode(&roomid)), &[])?;
 
     let tx = bk.tx.clone();
     let data = bk.data.clone();
@@ -339,8 +333,8 @@ pub fn join_room(bk: &Backend, roomid: String) -> Result<(), Error> {
     Ok(())
 }
 
-pub fn leave_room(bk: &Backend, roomid: String) -> Result<(), Error> {
-    let url = bk.url(&format!("rooms/{}/leave", roomid), vec![])?;
+pub fn leave_room(bk: &Backend, roomid: &str) -> Result<(), Error> {
+    let url = bk.url(&format!("rooms/{}/leave", roomid), &[])?;
 
     let tx = bk.tx.clone();
     post!(
@@ -356,15 +350,12 @@ pub fn leave_room(bk: &Backend, roomid: String) -> Result<(), Error> {
     Ok(())
 }
 
-pub fn mark_as_read(bk: &Backend, roomid: String, eventid: String) -> Result<(), Error> {
-    let url = bk.url(
-        &format!("rooms/{}/receipt/m.read/{}", roomid, eventid),
-        vec![],
-    )?;
+pub fn mark_as_read(bk: &Backend, roomid: &str, eventid: &str) -> Result<(), Error> {
+    let url = bk.url(&format!("rooms/{}/receipt/m.read/{}", roomid, eventid), &[])?;
 
     let tx = bk.tx.clone();
-    let r = roomid.clone();
-    let e = eventid.clone();
+    let r = String::from(roomid);
+    let e = String::from(eventid);
     post!(
         &url,
         move |_: JsonValue| {
@@ -379,7 +370,7 @@ pub fn mark_as_read(bk: &Backend, roomid: String, eventid: String) -> Result<(),
     // This event API call isn't in the current doc but I found this in the
     // matrix-js-sdk
     // https://github.com/matrix-org/matrix-js-sdk/blob/master/src/base-apis.js#L851
-    let url = bk.url(&format!("rooms/{}/read_markers", roomid), vec![])?;
+    let url = bk.url(&format!("rooms/{}/read_markers", roomid), &[])?;
     let attrs = json!({
         "m.fully_read": eventid,
         "m.read": json!(null),
@@ -389,8 +380,8 @@ pub fn mark_as_read(bk: &Backend, roomid: String, eventid: String) -> Result<(),
     Ok(())
 }
 
-pub fn set_room_name(bk: &Backend, roomid: String, name: String) -> Result<(), Error> {
-    let url = bk.url(&format!("rooms/{}/state/m.room.name", roomid), vec![])?;
+pub fn set_room_name(bk: &Backend, roomid: &str, name: &str) -> Result<(), Error> {
+    let url = bk.url(&format!("rooms/{}/state/m.room.name", roomid), &[])?;
 
     let attrs = json!({
         "name": name,
@@ -412,8 +403,8 @@ pub fn set_room_name(bk: &Backend, roomid: String, name: String) -> Result<(), E
     Ok(())
 }
 
-pub fn set_room_topic(bk: &Backend, roomid: String, topic: String) -> Result<(), Error> {
-    let url = bk.url(&format!("rooms/{}/state/m.room.topic", roomid), vec![])?;
+pub fn set_room_topic(bk: &Backend, roomid: &str, topic: &str) -> Result<(), Error> {
+    let url = bk.url(&format!("rooms/{}/state/m.room.topic", roomid), &[])?;
 
     let attrs = json!({
         "topic": topic,
@@ -435,12 +426,12 @@ pub fn set_room_topic(bk: &Backend, roomid: String, topic: String) -> Result<(),
     Ok(())
 }
 
-pub fn set_room_avatar(bk: &Backend, roomid: String, avatar: String) -> Result<(), Error> {
+pub fn set_room_avatar(bk: &Backend, roomid: &str, avatar: &str) -> Result<(), Error> {
     let baseu = bk.get_base_url()?;
     let tk = bk.data.lock().unwrap().access_token.clone();
     let params = vec![("access_token", tk.clone())];
-    let mediaurl = media_url(&baseu, "upload", params)?;
-    let roomurl = bk.url(&format!("rooms/{}/state/m.room.avatar", roomid), vec![])?;
+    let mediaurl = media_url(&baseu, "upload", &params)?;
+    let roomurl = bk.url(&format!("rooms/{}/state/m.room.avatar", roomid), &[])?;
 
     let mut file = File::open(&avatar)?;
     let mut contents: Vec<u8> = vec![];
@@ -484,7 +475,7 @@ pub fn attach_file(bk: &Backend, msg: Message) -> Result<(), Error> {
     let baseu = bk.get_base_url()?;
     let tk = bk.data.lock().unwrap().access_token.clone();
     let params = vec![("access_token", tk.clone())];
-    let mediaurl = media_url(&baseu, "upload", params)?;
+    let mediaurl = media_url(&baseu, "upload", &params)?;
 
     let mut m = msg.clone();
     let tx = bk.tx.clone();
@@ -510,11 +501,11 @@ pub fn attach_file(bk: &Backend, msg: Message) -> Result<(), Error> {
 
 pub fn new_room(
     bk: &Backend,
-    name: String,
+    name: &str,
     privacy: RoomType,
     internal_id: String,
 ) -> Result<(), Error> {
-    let url = bk.url("createRoom", vec![])?;
+    let url = bk.url("createRoom", &[])?;
     let attrs = json!({
         "invite": [],
         "invite_3pid": [],
@@ -530,7 +521,7 @@ pub fn new_room(
         },
     });
 
-    let n = name.clone();
+    let n = String::from(name);
     let tx = bk.tx.clone();
     post!(
         &url,
@@ -548,8 +539,8 @@ pub fn new_room(
     Ok(())
 }
 
-pub fn direct_chat(bk: &Backend, user: Member, internal_id: String) -> Result<(), Error> {
-    let url = bk.url("createRoom", vec![])?;
+pub fn direct_chat(bk: &Backend, user: &Member, internal_id: String) -> Result<(), Error> {
+    let url = bk.url("createRoom", &[])?;
     let attrs = json!({
         "invite": [user.uid.clone()],
         "invite_3pid": [],
@@ -559,7 +550,7 @@ pub fn direct_chat(bk: &Backend, user: Member, internal_id: String) -> Result<()
     });
 
     let userid = bk.data.lock().unwrap().user_id.clone();
-    let direct_url = bk.url(&format!("user/{}/account_data/m.direct", userid), vec![])?;
+    let direct_url = bk.url(&format!("user/{}/account_data/m.direct", userid), &[])?;
 
     let m = user.clone();
     let tx = bk.tx.clone();
@@ -602,7 +593,7 @@ pub fn add_to_fav(bk: &Backend, roomid: String, tofav: bool) -> Result<(), Error
     let userid = bk.data.lock().unwrap().user_id.clone();
     let url = bk.url(
         &format!("user/{}/rooms/{}/tags/m.favourite", userid, roomid),
-        vec![],
+        &[],
     )?;
 
     let attrs = json!({
@@ -627,8 +618,8 @@ pub fn add_to_fav(bk: &Backend, roomid: String, tofav: bool) -> Result<(), Error
     Ok(())
 }
 
-pub fn invite(bk: &Backend, roomid: String, userid: String) -> Result<(), Error> {
-    let url = bk.url(&format!("rooms/{}/invite", roomid), vec![])?;
+pub fn invite(bk: &Backend, roomid: &str, userid: &str) -> Result<(), Error> {
+    let url = bk.url(&format!("rooms/{}/invite", roomid), &[])?;
 
     let attrs = json!({
         "user_id": userid,
diff --git a/fractal-matrix-api/src/backend/stickers.rs b/fractal-matrix-api/src/backend/stickers.rs
index 074802a..ff9110c 100644
--- a/fractal-matrix-api/src/backend/stickers.rs
+++ b/fractal-matrix-api/src/backend/stickers.rs
@@ -33,7 +33,7 @@ pub fn list(bk: &Backend) -> Result<(), Error> {
         ("widget_id", widget_id),
         ("filter_unpurchased", "true".to_string()),
     ];
-    let url = vurl(bk.data.clone(), "widgets/assets", data)?;
+    let url = vurl(&bk.data, "widgets/assets", &data)?;
 
     let tx = bk.tx.clone();
     get!(
@@ -61,7 +61,7 @@ pub fn get_sticker_widget_id(bk: &Backend, then: BKCommand) -> Result<(), Error>
     let tx = bk.internal_tx.clone();
 
     thread::spawn(move || {
-        let url = vurl(d.clone(), "widgets/request", vec![]).unwrap();
+        let url = vurl(&d, "widgets/request", &[]).unwrap();
         match json_q("post", &url, &data, globals::TIMEOUT) {
             Ok(r) => {
                 let mut id = "".to_string();
@@ -91,14 +91,14 @@ pub fn get_sticker_widget_id(bk: &Backend, then: BKCommand) -> Result<(), Error>
     Ok(())
 }
 
-pub fn send(bk: &Backend, roomid: String, sticker: &Sticker) -> Result<(), Error> {
+pub fn send(bk: &Backend, roomid: &str, sticker: &Sticker) -> Result<(), Error> {
     let now = Local::now();
     let msg = format!("{}{}{}", roomid, sticker.name, now.to_string());
     let digest = md5::compute(msg.as_bytes());
     // TODO: we need to generate the msg.id in the frontend
     let id = format!("{:x}", digest);
 
-    let url = bk.url(&format!("rooms/{}/send/m.sticker/{}", roomid, id), vec![])?;
+    let url = bk.url(&format!("rooms/{}/send/m.sticker/{}", roomid, id), &[])?;
 
     let attrs = json!({
         "body": sticker.body.clone(),
@@ -142,7 +142,7 @@ pub fn purchase(bk: &Backend, group: &StickerGroup) -> Result<(), Error> {
         ("widget_id", widget_id.clone()),
         ("widget_type", "m.stickerpicker".to_string()),
     ];
-    let url = vurl(bk.data.clone(), "widgets/purchase_asset", data)?;
+    let url = vurl(&bk.data, "widgets/purchase_asset", &data)?;
     let tx = bk.tx.clone();
     let itx = bk.internal_tx.clone();
     get!(
@@ -156,35 +156,31 @@ pub fn purchase(bk: &Backend, group: &StickerGroup) -> Result<(), Error> {
     Ok(())
 }
 
-fn get_base_url(data: Arc<Mutex<BackendData>>) -> Result<Url, Error> {
+fn get_base_url(data: &Arc<Mutex<BackendData>>) -> Result<Url, Error> {
     let s = data.lock().unwrap().server_url.clone();
     let url = Url::parse(&s)?;
     Ok(url)
 }
 
 fn url(
-    data: Arc<Mutex<BackendData>>,
+    data: &Arc<Mutex<BackendData>>,
     path: &str,
-    params: Vec<(&str, String)>,
+    params: &[(&str, String)],
 ) -> Result<Url, Error> {
-    let base = get_base_url(data.clone())?;
+    let base = get_base_url(data)?;
     let tk = data.lock().unwrap().access_token.clone();
 
     let mut params2 = params.to_vec();
     params2.push(("access_token", tk.clone()));
 
-    client_url(&base, path, params2)
+    client_url(&base, path, &params2)
 }
 
-fn get_scalar_token(data: Arc<Mutex<BackendData>>) -> Result<String, Error> {
+fn get_scalar_token(data: &Arc<Mutex<BackendData>>) -> Result<String, Error> {
     let s = data.lock().unwrap().scalar_url.clone();
     let uid = data.lock().unwrap().user_id.clone();
 
-    let url = url(
-        data.clone(),
-        &format!("user/{}/openid/request_token", uid),
-        vec![],
-    )?;
+    let url = url(data, &format!("user/{}/openid/request_token", uid), &[])?;
     let js = json_q("post", &url, &json!({}), globals::TIMEOUT)?;
 
     let vurl = Url::parse(&format!("{}/api/register", s))?;
@@ -200,20 +196,20 @@ fn get_scalar_token(data: Arc<Mutex<BackendData>>) -> Result<String, Error> {
 }
 
 fn vurl(
-    data: Arc<Mutex<BackendData>>,
+    data: &Arc<Mutex<BackendData>>,
     path: &str,
-    params: Vec<(&str, String)>,
+    params: &[(&str, String)],
 ) -> Result<Url, Error> {
     let s = data.lock().unwrap().scalar_url.clone();
     let base = Url::parse(&s)?;
     let token = data.lock().unwrap().scalar_token.clone();
     let tk = match token {
-        None => get_scalar_token(data)?,
+        None => get_scalar_token(&data)?,
         Some(t) => t.clone(),
     };
 
     let mut params2 = params.to_vec();
     params2.push(("scalar_token", tk));
 
-    scalar_url(&base, path, params2)
+    scalar_url(&base, path, &params2)
 }
diff --git a/fractal-matrix-api/src/backend/sync.rs b/fractal-matrix-api/src/backend/sync.rs
index 6db09d2..a99f131 100644
--- a/fractal-matrix-api/src/backend/sync.rs
+++ b/fractal-matrix-api/src/backend/sync.rs
@@ -56,7 +56,7 @@ pub fn sync(bk: &Backend, new_since: Option<String>, initial: bool) -> Result<()
     }
 
     let baseu = bk.get_base_url()?;
-    let url = bk.url("sync", params)?;
+    let url = bk.url("sync", &params)?;
 
     let tx = bk.tx.clone();
     let data = bk.data.clone();
@@ -75,7 +75,7 @@ pub fn sync(bk: &Backend, new_since: Option<String>, initial: bool) -> Result<()
                     };
 
                     // Message events
-                    match get_rooms_timeline_from_json(&baseu, &r, tk.clone(), since.clone()) {
+                    match get_rooms_timeline_from_json(&baseu, &r, &tk, &since) {
                         Ok(msgs) => tx.send(BKResponse::RoomMessages(msgs)).unwrap(),
                         Err(err) => tx.send(BKResponse::RoomMessagesError(err)).unwrap(),
                     };
diff --git a/fractal-matrix-api/src/backend/types.rs b/fractal-matrix-api/src/backend/types.rs
index 5919b6e..72d2a20 100644
--- a/fractal-matrix-api/src/backend/types.rs
+++ b/fractal-matrix-api/src/backend/types.rs
@@ -177,7 +177,7 @@ pub enum BKResponse {
     StickersError(Error),
 }
 
-#[derive(Debug)]
+#[derive(Debug, Clone, Copy)]
 pub enum RoomType {
     Public,
     Private,
diff --git a/fractal-matrix-api/src/backend/user.rs b/fractal-matrix-api/src/backend/user.rs
index 75166ab..1de1308 100644
--- a/fractal-matrix-api/src/backend/user.rs
+++ b/fractal-matrix-api/src/backend/user.rs
@@ -25,7 +25,7 @@ use serde_json::Value as JsonValue;
 
 pub fn get_username(bk: &Backend) -> Result<(), Error> {
     let id = bk.data.lock().unwrap().user_id.clone();
-    let url = bk.url(&format!("profile/{}/displayname", encode_uid(&id)), vec![])?;
+    let url = bk.url(&format!("profile/{}/displayname", encode_uid(&id)), &[])?;
     let tx = bk.tx.clone();
     get!(
         &url,
@@ -41,7 +41,7 @@ pub fn get_username(bk: &Backend) -> Result<(), Error> {
 
 pub fn set_username(bk: &Backend, name: String) -> Result<(), Error> {
     let id = bk.data.lock().unwrap().user_id.clone();
-    let url = bk.url(&format!("profile/{}/displayname", encode_uid(&id)), vec![])?;
+    let url = bk.url(&format!("profile/{}/displayname", encode_uid(&id)), &[])?;
 
     let attrs = json!({
         "displayname": name,
@@ -64,7 +64,7 @@ pub fn set_username(bk: &Backend, name: String) -> Result<(), Error> {
 }
 
 pub fn get_threepid(bk: &Backend) -> Result<(), Error> {
-    let url = bk.url(&format!("account/3pid"), vec![])?;
+    let url = bk.url(&format!("account/3pid"), &[])?;
     let tx = bk.tx.clone();
     get!(
         &url,
@@ -107,11 +107,11 @@ pub fn get_threepid(bk: &Backend) -> Result<(), Error> {
 
 pub fn get_email_token(
     bk: &Backend,
-    identity: String,
-    email: String,
+    identity: &str,
+    email: &str,
     client_secret: String,
 ) -> Result<(), Error> {
-    let url = bk.url(&format!("account/3pid/email/requestToken"), vec![])?;
+    let url = bk.url("account/3pid/email/requestToken", &[])?;
 
     let attrs = json!({
         "id_server": identity[8..],
@@ -146,11 +146,11 @@ pub fn get_email_token(
 
 pub fn get_phone_token(
     bk: &Backend,
-    identity: String,
-    phone: String,
+    identity: &str,
+    phone: &str,
     client_secret: String,
 ) -> Result<(), Error> {
-    let url = bk.url(&format!("account/3pid/msisdn/requestToken"), vec![])?;
+    let url = bk.url(&format!("account/3pid/msisdn/requestToken"), &[])?;
 
     let attrs = json!({
         "id_server": identity[8..],
@@ -186,11 +186,11 @@ pub fn get_phone_token(
 
 pub fn add_threepid(
     bk: &Backend,
-    identity: String,
-    client_secret: String,
+    identity: &str,
+    client_secret: &str,
     sid: String,
 ) -> Result<(), Error> {
-    let url = bk.url(&format!("account/3pid"), vec![])?;
+    let url = bk.url(&format!("account/3pid"), &[])?;
     let attrs = json!({
         "three_pid_creds": {
             "id_server": identity[8..],
@@ -217,7 +217,7 @@ pub fn add_threepid(
 
 pub fn submit_phone_token(
     bk: &Backend,
-    url: String,
+    url: &str,
     client_secret: String,
     sid: String,
     token: String,
@@ -228,7 +228,7 @@ pub fn submit_phone_token(
         ("token", token),
     ];
     let path = "/_matrix/identity/api/v1/validate/msisdn/submitToken";
-    let url = build_url(&Url::parse(&url)?, path, params)?;
+    let url = build_url(&Url::parse(&url)?, path, &params)?;
 
     let tx = bk.tx.clone();
     post!(
@@ -250,7 +250,7 @@ pub fn submit_phone_token(
     Ok(())
 }
 
-pub fn delete_three_pid(bk: &Backend, medium: String, address: String) -> Result<(), Error> {
+pub fn delete_three_pid(bk: &Backend, medium: &str, address: &str) -> Result<(), Error> {
     let baseu = bk.get_base_url()?;
     let tk = bk.data.lock().unwrap().access_token.clone();
     let mut url = baseu.join("/_matrix/client/unstable/account/3pid/delete")?;
@@ -279,11 +279,11 @@ pub fn delete_three_pid(bk: &Backend, medium: String, address: String) -> Result
 
 pub fn change_password(
     bk: &Backend,
-    username: String,
-    old_password: String,
-    new_password: String,
+    username: &str,
+    old_password: &str,
+    new_password: &str,
 ) -> Result<(), Error> {
-    let url = bk.url(&format!("account/password"), vec![])?;
+    let url = bk.url(&format!("account/password"), &[])?;
 
     let attrs = json!({
         "new_password": new_password,
@@ -312,11 +312,11 @@ pub fn change_password(
 
 pub fn account_destruction(
     bk: &Backend,
-    username: String,
-    password: String,
+    username: &str,
+    password: &str,
     flag: bool,
 ) -> Result<(), Error> {
-    let url = bk.url(&format!("account/deactivate"), vec![])?;
+    let url = bk.url(&format!("account/deactivate"), &[])?;
 
     let attrs = json!({
         "erase": flag,
@@ -409,7 +409,7 @@ pub fn get_user_info_async(
 }
 
 pub fn get_username_async(bk: &Backend, uid: String, tx: Sender<String>) -> Result<(), Error> {
-    let url = bk.url(&format!("profile/{}/displayname", encode_uid(&uid)), vec![])?;
+    let url = bk.url(&format!("profile/{}/displayname", encode_uid(&uid)), &[])?;
     get!(
         &url,
         |r: JsonValue| {
@@ -441,8 +441,8 @@ pub fn get_avatar_async(
 
     semaphore(bk.limit_threads.clone(), move || match get_user_avatar_img(
         &baseu,
-        uid,
-        avatar.unwrap_or_default(),
+        &uid,
+        &avatar.unwrap_or_default(),
     ) {
         Ok(fname) => {
             tx.send(fname.clone()).unwrap();
@@ -460,8 +460,8 @@ pub fn set_user_avatar(bk: &Backend, avatar: String) -> Result<(), Error> {
     let id = bk.data.lock().unwrap().user_id.clone();
     let tk = bk.data.lock().unwrap().access_token.clone();
     let params = vec![("access_token", tk.clone())];
-    let mediaurl = media_url(&baseu, "upload", params)?;
-    let url = bk.url(&format!("profile/{}/avatar_url", encode_uid(&id)), vec![])?;
+    let mediaurl = media_url(&baseu, "upload", &params)?;
+    let url = bk.url(&format!("profile/{}/avatar_url", encode_uid(&id)), &[])?;
 
     let mut file = File::open(&avatar)?;
     let mut contents: Vec<u8> = vec![];
@@ -491,8 +491,8 @@ pub fn set_user_avatar(bk: &Backend, avatar: String) -> Result<(), Error> {
     Ok(())
 }
 
-pub fn search(bk: &Backend, term: String) -> Result<(), Error> {
-    let url = bk.url(&format!("user_directory/search"), vec![])?;
+pub fn search(bk: &Backend, term: &str) -> Result<(), Error> {
+    let url = bk.url(&format!("user_directory/search"), &[])?;
 
     let attrs = json!({
         "search_term": term,
diff --git a/fractal-matrix-api/src/model/message.rs b/fractal-matrix-api/src/model/message.rs
index 2a7bc94..24767bf 100644
--- a/fractal-matrix-api/src/model/message.rs
+++ b/fractal-matrix-api/src/model/message.rs
@@ -110,7 +110,7 @@ impl Message {
     ///
     /// * `roomid` - The message room id
     /// * `msg` - The message event as Json
-    pub fn parse_room_message(roomid: String, msg: &JsonValue) -> Message {
+    pub fn parse_room_message(roomid: &str, msg: &JsonValue) -> Message {
         let sender = msg["sender"].as_str().unwrap_or("");
 
         let timestamp = msg["origin_server_ts"].as_i64().unwrap_or(0) / 1000;
@@ -124,7 +124,7 @@ impl Message {
         let mut message = Message {
             sender: sender.to_string(),
             date: server_timestamp,
-            room: roomid.clone(),
+            room: String::from(roomid),
             id: Some(id.to_string()),
             mtype: type_.to_string(),
             body: "".to_string(),
@@ -200,7 +200,7 @@ impl Message {
     ///
     /// * `roomid` - The messages room id
     /// * `events` - An iterator to the json events
-    pub fn from_json_events_iter<'a, I>(roomid: String, events: I) -> Vec<Message>
+    pub fn from_json_events_iter<'a, I>(roomid: &str, events: I) -> Vec<Message>
     where
         I: Iterator<Item = &'a JsonValue>,
     {
diff --git a/fractal-matrix-api/src/util.rs b/fractal-matrix-api/src/util.rs
index b97d602..f8f616d 100644
--- a/fractal-matrix-api/src/util.rs
+++ b/fractal-matrix-api/src/util.rs
@@ -227,7 +227,7 @@ pub fn get_rooms_from_json(r: &JsonValue, userid: &str, baseu: &Url) -> Result<V
         }
 
         if let Some(evs) = timeline["events"].as_array() {
-            let ms = Message::from_json_events_iter(k.clone(), evs.iter());
+            let ms = Message::from_json_events_iter(&k, evs.iter());
             r.messages.extend(ms);
         }
 
@@ -333,8 +333,8 @@ pub fn get_admins(stevents: &JsonValue) -> HashMap<String, i32> {
 pub fn get_rooms_timeline_from_json(
     baseu: &Url,
     r: &JsonValue,
-    tk: String,
-    prev_batch: String,
+    tk: &str,
+    prev_batch: &str,
 ) -> Result<Vec<Message>, Error> {
     let rooms = &r["rooms"];
     let join = rooms["join"].as_object().ok_or(Error::BackendError)?;
@@ -348,13 +348,8 @@ pub fn get_rooms_timeline_from_json(
             room["timeline"]["prev_batch"].as_str(),
         ) {
             let pbs = pb.to_string();
-            let fill_the_gap = fill_room_gap(
-                baseu,
-                tk.clone(),
-                k.clone(),
-                prev_batch.clone(),
-                pbs.clone(),
-            )?;
+            let fill_the_gap =
+                fill_room_gap(baseu, String::from(tk), k.clone(), &prev_batch, &pbs)?;
             for m in fill_the_gap {
                 msgs.push(m);
             }
@@ -366,7 +361,7 @@ pub fn get_rooms_timeline_from_json(
         }
 
         let events = timeline.unwrap().iter();
-        let ms = Message::from_json_events_iter(k.clone(), events);
+        let ms = Message::from_json_events_iter(&k, events);
         msgs.extend(ms);
     }
 
@@ -427,14 +422,14 @@ pub fn parse_sync_events(r: &JsonValue) -> Result<Vec<Event>, Error> {
 
 pub fn get_prev_batch_from(
     baseu: &Url,
-    tk: String,
-    roomid: String,
-    evid: String,
+    tk: &str,
+    roomid: &str,
+    evid: &str,
 ) -> Result<String, Error> {
-    let params = vec![("access_token", tk.clone()), ("limit", 0.to_string())];
+    let params = vec![("access_token", String::from(tk)), ("limit", 0.to_string())];
 
     let path = format!("rooms/{}/context/{}", roomid, evid);
-    let url = client_url(baseu, &path, params)?;
+    let url = client_url(baseu, &path, &params)?;
 
     let r = json_q("get", &url, &json!(null), globals::TIMEOUT)?;
     let prev_batch = r["start"].to_string().trim_matches('"').to_string();
@@ -444,16 +439,16 @@ pub fn get_prev_batch_from(
 
 pub fn get_room_media_list(
     baseu: &Url,
-    tk: String,
-    roomid: String,
+    tk: &str,
+    roomid: &str,
     limit: i32,
     first_media_id: Option<String>,
-    prev_batch: Option<String>,
+    prev_batch: &Option<String>,
 ) -> Result<(Vec<Message>, String), Error> {
     let mut params = vec![
         ("dir", String::from("b")),
         ("limit", format!("{}", limit)),
-        ("access_token", tk.clone()),
+        ("access_token", String::from(tk)),
         (
             "filter",
             "{\"filter_json\": { \"contains_url\": true, \"not_types\": [\"m.sticker\"] } }"
@@ -465,13 +460,13 @@ pub fn get_room_media_list(
         Some(ref pb) => params.push(("from", pb.clone())),
         None => {
             if let Some(id) = first_media_id {
-                params.push(("from", get_prev_batch_from(baseu, tk, roomid.clone(), id)?))
+                params.push(("from", get_prev_batch_from(baseu, tk, &roomid, &id)?))
             }
         }
     };
 
     let path = format!("rooms/{}/messages", roomid);
-    let url = client_url(baseu, &path, params)?;
+    let url = client_url(baseu, &path, &params)?;
 
     let r = json_q("get", &url, &json!(null), globals::TIMEOUT)?;
     let array = r["chunk"].as_array();
@@ -481,7 +476,7 @@ pub fn get_room_media_list(
     }
 
     let evs = array.unwrap().iter().rev();
-    let media_list = Message::from_json_events_iter(roomid.clone(), evs);
+    let media_list = Message::from_json_events_iter(roomid, evs);
 
     Ok((media_list, prev_batch))
 }
@@ -529,7 +524,7 @@ pub fn resolve_media_url(base: &Url, url: &str, thumb: bool, w: i32, h: i32) ->
         path = format!("download/{}/{}", server, media);
     }
 
-    media_url(base, &path, params)
+    media_url(base, &path, &params)
 }
 
 pub fn dw_media(
@@ -557,7 +552,7 @@ pub fn dw_media(
         path = format!("download/{}/{}", server, media);
     }
 
-    let url = media_url(base, &path, params)?;
+    let url = media_url(base, &path, &params)?;
 
     let fname = match dest {
         None if thumb => cache_dir_path("thumbs", &media)?,
@@ -658,7 +653,7 @@ pub fn json_q(
 }
 
 pub fn get_user_avatar(baseu: &Url, userid: &str) -> Result<(String, String), Error> {
-    let url = client_url(baseu, &format!("profile/{}", encode_uid(userid)), vec![])?;
+    let url = client_url(baseu, &format!("profile/{}", encode_uid(userid)), &[])?;
     let attrs = json!(null);
 
     match json_q("get", &url, &attrs, globals::TIMEOUT) {
@@ -686,7 +681,7 @@ pub fn get_room_st(base: &Url, tk: &str, roomid: &str) -> Result<JsonValue, Erro
     let url = client_url(
         base,
         &format!("rooms/{}/state", roomid),
-        vec![("access_token", String::from(tk))],
+        &vec![("access_token", String::from(tk))],
     )?;
 
     let attrs = json!(null);
@@ -797,8 +792,8 @@ pub fn fill_room_gap(
     baseu: &Url,
     tk: String,
     roomid: String,
-    from: String,
-    to: String,
+    from: &str,
+    to: &str,
 ) -> Result<Vec<Message>, Error> {
     let mut ms: Vec<Message> = vec![];
     let nend;
@@ -809,11 +804,11 @@ pub fn fill_room_gap(
         ("access_token", tk.clone()),
     ];
 
-    params.push(("from", from.clone()));
-    params.push(("to", to.clone()));
+    params.push(("from", String::from(from)));
+    params.push(("to", String::from(to)));
 
     let path = format!("rooms/{}/messages", roomid);
-    let url = client_url(baseu, &path, params)?;
+    let url = client_url(baseu, &path, &params)?;
 
     let r = json_q("get", &url, &json!(null), globals::TIMEOUT)?;
     nend = String::from(r["end"].as_str().unwrap_or(""));
@@ -824,11 +819,11 @@ pub fn fill_room_gap(
     }
 
     let evs = array.unwrap().iter();
-    let mevents = Message::from_json_events_iter(roomid.clone(), evs);
+    let mevents = Message::from_json_events_iter(&roomid, evs);
     ms.extend(mevents);
 
     // loading more until no more messages
-    let more = fill_room_gap(baseu, tk, roomid, nend, to)?;
+    let more = fill_room_gap(baseu, tk, roomid, &nend, to)?;
     for m in more.iter() {
         ms.insert(0, m.clone());
     }
@@ -836,7 +831,7 @@ pub fn fill_room_gap(
     Ok(ms)
 }
 
-pub fn build_url(base: &Url, path: &str, params: Vec<(&str, String)>) -> Result<Url, Error> {
+pub fn build_url(base: &Url, path: &str, params: &[(&str, String)]) -> Result<Url, Error> {
     let mut url = base.join(path)?;
 
     {
@@ -853,15 +848,15 @@ pub fn build_url(base: &Url, path: &str, params: Vec<(&str, String)>) -> Result<
     Ok(url)
 }
 
-pub fn client_url(base: &Url, path: &str, params: Vec<(&str, String)>) -> Result<Url, Error> {
+pub fn client_url(base: &Url, path: &str, params: &[(&str, String)]) -> Result<Url, Error> {
     build_url(base, &format!("/_matrix/client/r0/{}", path), params)
 }
 
-pub fn scalar_url(base: &Url, path: &str, params: Vec<(&str, String)>) -> Result<Url, Error> {
+pub fn scalar_url(base: &Url, path: &str, params: &[(&str, String)]) -> Result<Url, Error> {
     build_url(base, &format!("api/{}", path), params)
 }
 
-pub fn media_url(base: &Url, path: &str, params: Vec<(&str, String)>) -> Result<Url, Error> {
+pub fn media_url(base: &Url, path: &str, params: &[(&str, String)]) -> Result<Url, Error> {
     build_url(base, &format!("/_matrix/media/r0/{}", path), params)
 }
 
@@ -900,7 +895,7 @@ pub fn cache_dir_path(dir: &str, name: &str) -> Result<String, Error> {
     Ok(path.into_os_string().into_string()?)
 }
 
-pub fn get_user_avatar_img(baseu: &Url, userid: String, avatar: String) -> Result<String, Error> {
+pub fn get_user_avatar_img(baseu: &Url, userid: &str, avatar: &str) -> Result<String, Error> {
     if avatar.is_empty() {
         return Ok(String::from(""));
     }


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