Skip to content

Commit 4eb374f

Browse files
committed
Handle some unwrap calls
1 parent a6df37b commit 4eb374f

File tree

8 files changed

+68
-44
lines changed

8 files changed

+68
-44
lines changed

src/ext.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
use rqs_lib::channel::{Message, MessageClient};
2+
3+
pub trait MessageExt {
4+
fn as_client_unchecked(&self) -> &MessageClient;
5+
}
6+
7+
impl MessageExt for Message {
8+
fn as_client_unchecked(&self) -> &MessageClient {
9+
match self {
10+
Message::Client(message_client) => message_client,
11+
_ => panic!("Failed to cast Message to MessageClient"),
12+
}
13+
}
14+
}

src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ mod application;
22
#[rustfmt::skip]
33
mod config;
44
mod constants;
5+
mod ext;
56
mod monitors;
67
mod objects;
78
mod plugins;

src/objects/send_transfer.rs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use rqs_lib::hdl::{
77
info::{TransferPayload, TransferPayloadKind},
88
};
99

10-
use crate::{impl_deref_for_newtype, utils};
10+
use crate::{ext::MessageExt, impl_deref_for_newtype, utils};
1111

1212
#[derive(Debug, Clone, Default, glib::Boxed)]
1313
#[boxed_type(name = "StateBoxed")]
@@ -39,8 +39,7 @@ impl_deref_for_newtype!(ChannelMessage, rqs_lib::channel::ChannelMessage);
3939
impl ChannelMessage {
4040
pub fn device_name(&self) -> String {
4141
self.msg
42-
.as_client()
43-
.unwrap()
42+
.as_client_unchecked()
4443
.metadata
4544
.as_ref()
4645
.and_then(|meta| meta.source.as_ref())
@@ -50,8 +49,7 @@ impl ChannelMessage {
5049

5150
pub fn files(&self) -> Option<&Vec<String>> {
5251
self.msg
53-
.as_client()
54-
.unwrap()
52+
.as_client_unchecked()
5553
.metadata
5654
.as_ref()
5755
.and_then(|it| match &it.payload {
@@ -62,17 +60,15 @@ impl ChannelMessage {
6260

6361
pub fn text_preview(&self) -> Option<String> {
6462
self.msg
65-
.as_client()
66-
.unwrap()
63+
.as_client_unchecked()
6764
.metadata
6865
.as_ref()
6966
.and_then(|meta| meta.payload_preview.clone())
7067
}
7168

7269
pub fn is_text_type(&self) -> bool {
7370
self.msg
74-
.as_client()
75-
.unwrap()
71+
.as_client_unchecked()
7672
.metadata
7773
.as_ref()
7874
.map(|meta| match meta.payload_kind {
@@ -86,8 +82,7 @@ impl ChannelMessage {
8682

8783
pub fn transferred_text_data(&self) -> Option<(String, TextPayloadType)> {
8884
self.msg
89-
.as_client()
90-
.unwrap()
85+
.as_client_unchecked()
9186
.metadata
9287
.as_ref()
9388
.and_then(|meta| match &meta.payload {

src/utils.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,10 +124,10 @@ pub fn remove_notification(id: String) {
124124
}
125125

126126
pub fn strip_user_home_prefix<P: AsRef<Path>>(path: P) -> PathBuf {
127-
if let Some(home) = dirs::home_dir() {
128-
if path.as_ref().starts_with(&home) {
129-
return PathBuf::from("~").join(path.as_ref().strip_prefix(&home).unwrap());
130-
}
127+
if let Some(home) = dirs::home_dir()
128+
&& let Ok(stripped) = path.as_ref().strip_prefix(&home)
129+
{
130+
return PathBuf::from("~").join(stripped);
131131
}
132132

133133
path.as_ref().into()

src/widgets/file_card.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,12 @@ pub fn create_file_card(
100100
root_box.append(&file_avatar);
101101

102102
let filename_label = gtk::Label::builder()
103-
.label(model_item.basename().unwrap().to_string_lossy())
103+
.label(
104+
model_item
105+
.basename()
106+
.expect("Derived GFile from uri/path should be valid")
107+
.to_string_lossy(),
108+
)
104109
.xalign(0.)
105110
.hexpand(true)
106111
.wrap(true)

src/widgets/receive_transfer.rs

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use rqs_lib::hdl::TextPayloadType;
1313
use tokio_util::sync::CancellationToken;
1414

1515
use crate::{
16+
ext::MessageExt,
1617
objects::{self, UserAction},
1718
utils::{remove_notification, spawn_notification},
1819
window::PacketApplicationWindow,
@@ -55,7 +56,10 @@ pub fn present_receive_transfer_ui(
5556
notification_id: String,
5657
auto_decline_ctk: CancellationToken,
5758
) {
58-
let init_id = receive_state.event().unwrap().id.clone();
59+
let event = receive_state
60+
.event()
61+
.expect("ReceiveTransferState.event must be set");
62+
let init_id = event.id.clone();
5963
let win = win.clone();
6064

6165
// Progress dialog
@@ -94,7 +98,7 @@ pub fn present_receive_transfer_ui(
9498
.build();
9599
progress_stack.add_named(&progress_files_box, Some("progress_files"));
96100

97-
let device_name = receive_state.event().unwrap().device_name();
101+
let device_name = event.device_name();
98102
let device_name_box = create_device_name_box(&device_name);
99103
device_name_box.set_margin_bottom(4);
100104
progress_files_box.append(&device_name_box);
@@ -169,7 +173,9 @@ pub fn present_receive_transfer_ui(
169173
auto_decline_ctk.cancel();
170174
}
171175

172-
let event = receive_state.event().unwrap();
176+
let event = receive_state
177+
.event()
178+
.expect("ReceiveTransferState.event must be set");
173179
match receive_state.user_action() {
174180
Some(UserAction::ConsentAccept) => {
175181
consent_dialog.close();
@@ -257,8 +263,9 @@ pub fn present_receive_transfer_ui(
257263
move |receive_state| {
258264
use rqs_lib::TransferState;
259265

260-
let event_msg = receive_state.event().expect("Property setter isn't nullable");
261-
let client_msg = event_msg.msg.as_client().unwrap();
266+
let event_msg = receive_state.event().expect("ReceiveTransferState.event must be set");
267+
let client_msg = event_msg.msg.as_client_unchecked();
268+
let metadata = client_msg.metadata.as_ref().unwrap();
262269

263270
match client_msg.state.clone().unwrap_or(TransferState::Initial) {
264271
TransferState::Initial => {}
@@ -295,7 +302,7 @@ pub fn present_receive_transfer_ui(
295302
let device_name_box = create_device_name_box(&device_name);
296303
info_box.append(&device_name_box);
297304

298-
let total_bytes = client_msg.metadata.as_ref().unwrap().total_bytes;
305+
let total_bytes = metadata.total_bytes;
299306
let transfer_size = human_bytes::human_bytes(total_bytes as f64);
300307

301308
if let Some(files) = event_msg.files() {
@@ -346,10 +353,9 @@ pub fn present_receive_transfer_ui(
346353
client_msg
347354
.metadata
348355
.as_ref()
349-
.unwrap()
350-
.pin_code
351-
.clone()
352-
.unwrap_or_default()
356+
.map(|it| it.pin_code.as_ref().map(|it| it.as_str()))
357+
.flatten()
358+
.unwrap_or("???")
353359
)
354360
.unwrap_or_else(|_| "badly formatted locale string".into()),
355361
)
@@ -462,7 +468,7 @@ pub fn present_receive_transfer_ui(
462468

463469
// TODO: show a progress dialog for both but with a delay?
464470
// Create Progress bar dialog
465-
let total_bytes = client_msg.metadata.as_ref().unwrap().total_bytes;
471+
let total_bytes = metadata.total_bytes;
466472
receive_state
467473
.imp()
468474
.eta

src/widgets/recipient_card.rs

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use crate::{
2+
ext::MessageExt,
23
objects::{self, TransferState, send_transfer::SendRequestState},
34
tokio_runtime,
45
window::PacketApplicationWindow,
@@ -11,7 +12,7 @@ use gettextrs::{gettext, ngettext};
1112
use gtk::{gio, glib, glib::clone};
1213
use rqs_lib::channel::{ChannelMessage, MessageClient};
1314

14-
fn get_model_item_from_listbox<T>(
15+
fn get_model_item_from_listbox_row<T>(
1516
model: &gio::ListStore,
1617
list_box: &gtk::ListBox,
1718
row: &gtk::ListBoxRow,
@@ -44,7 +45,7 @@ where
4445
{
4546
let mut pos = 0;
4647
while let Some(x) = model.item(pos) {
47-
if x.downcast_ref::<T>().unwrap() == model_item {
48+
if x.downcast_ref::<T>()? == model_item {
4849
break;
4950
}
5051
pos = pos + 1;
@@ -61,8 +62,8 @@ pub fn handle_recipient_card_clicked(
6162
let imp = win.imp();
6263

6364
let model_item =
64-
get_model_item_from_listbox::<SendRequestState>(&imp.recipient_model, list_box, row)
65-
.unwrap();
65+
get_model_item_from_listbox_row::<SendRequestState>(&imp.recipient_model, list_box, row)
66+
.expect("Index should be valid since model and ListBox are related");
6667

6768
emit_send_files(win, &model_item);
6869

@@ -91,15 +92,19 @@ fn emit_send_files(win: &PacketApplicationWindow, model_item: &SendRequestState)
9192
model_item.set_transfer_state(TransferState::Queued);
9293
}
9394

94-
tokio_runtime().spawn(clone!(
95+
glib::spawn_future_local(clone!(
9596
#[weak(rename_to = file_sender)]
9697
imp.file_sender,
98+
// #[weak]
99+
// model_item,
97100
async move {
101+
// FIXME: Set Failed state on Err and update UI on Failed state change
102+
// model_item.set_transfer_state(TransferState::Failed);
98103
file_sender
99104
.lock()
100105
.await
101106
.as_mut()
102-
.unwrap()
107+
.expect("RQS .file_sender must be set")
103108
.send(rqs_lib::SendInfo {
104109
id: endpoint_info.id.clone(),
105110
name: endpoint_info
@@ -401,7 +406,7 @@ pub fn create_recipient_card(
401406
let eta_estimator = model_item.imp().eta.as_ref();
402407

403408
if let Some(event_msg) = model_item.event() {
404-
let client_msg = event_msg.msg.as_client().unwrap();
409+
let client_msg = event_msg.msg.as_client_unchecked();
405410
let state = client_msg.state.as_ref().unwrap_or(&RqsState::Initial);
406411

407412
match state {
@@ -444,10 +449,9 @@ pub fn create_recipient_card(
444449
client_msg
445450
.metadata
446451
.as_ref()
447-
.unwrap()
448-
.pin_code
449-
.clone()
450-
.unwrap()
452+
.map(|it| it.pin_code.as_ref().map(|it| it.as_str()))
453+
.flatten()
454+
.unwrap_or("???")
451455
)
452456
.unwrap_or_else(|_| "badly formatted locale string".into()),
453457
);

src/window.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use tokio_util::sync::CancellationToken;
1919
use crate::application::PacketApplication;
2020
use crate::config::{APP_ID, PROFILE};
2121
use crate::constants::packet_log_path;
22+
use crate::ext::MessageExt;
2223
use crate::objects::{self, SendRequestState};
2324
use crate::objects::{TransferState, UserAction};
2425
use crate::plugins::{FileBasedPlugin, NautilusPlugin, Plugin};
@@ -49,7 +50,7 @@ mod imp {
4950

5051
use tokio::sync::Mutex;
5152

52-
use crate::utils::remove_notification;
53+
use crate::{ext::MessageExt, utils::remove_notification};
5354

5455
use super::*;
5556

@@ -247,8 +248,7 @@ mod imp {
247248
.event()
248249
.unwrap()
249250
.msg
250-
.as_client()
251-
.expect("Cached TransferMessage is only of type User")
251+
.as_client_unchecked()
252252
.state
253253
.as_ref()
254254
.unwrap_or(&TransferState::Initial)
@@ -1784,8 +1784,7 @@ impl PacketApplicationWindow {
17841784
.event()
17851785
.unwrap()
17861786
.msg
1787-
.as_client()
1788-
.unwrap()
1787+
.as_client_unchecked()
17891788
.state
17901789
.as_ref()
17911790
.unwrap_or(&rqs_lib::TransferState::Initial)
@@ -2139,7 +2138,7 @@ impl PacketApplicationWindow {
21392138
tracing::debug!(event = ?channel_message, "Received event on UI thread");
21402139

21412140
let id = &channel_message.id;
2142-
let client_msg = channel_message.msg.as_client().unwrap();
2141+
let client_msg = channel_message.msg.as_client_unchecked();
21432142

21442143
use rqs_lib::TransferState;
21452144
match client_msg

0 commit comments

Comments
 (0)