From b53613d1e075b8c6b7f6d705e359c42dcec6798a Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Thu, 17 Jun 2021 22:23:43 +0200 Subject: [PATCH] let get_selection_account return an Option<> --- deltachat-ffi/deltachat.h | 1 + deltachat-ffi/src/lib.rs | 5 +++-- src/accounts.rs | 13 ++++--------- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/deltachat-ffi/deltachat.h b/deltachat-ffi/deltachat.h index 4ea95f46f..269bca9f3 100644 --- a/deltachat-ffi/deltachat.h +++ b/deltachat-ffi/deltachat.h @@ -2486,6 +2486,7 @@ dc_context_t* dc_accounts_get_account (dc_accounts_t* accounts, uint32 * unmanaged account-context as created by dc_context_new(). * Once you do no longer need the context-object, you have to call dc_context_unref() on it, * which, however, will not close the account but only decrease a reference counter. + * If there is no selected account, NULL is returned. */ dc_context_t* dc_accounts_get_selected_account (dc_accounts_t* accounts); diff --git a/deltachat-ffi/src/lib.rs b/deltachat-ffi/src/lib.rs index 3a1efbc5b..589fe5397 100644 --- a/deltachat-ffi/src/lib.rs +++ b/deltachat-ffi/src/lib.rs @@ -3695,8 +3695,9 @@ pub unsafe extern "C" fn dc_accounts_get_selected_account( } let accounts = &*accounts; - let ctx = block_on(accounts.get_selected_account()); - Box::into_raw(Box::new(ctx)) + block_on(accounts.get_selected_account()) + .map(|ctx| Box::into_raw(Box::new(ctx))) + .unwrap_or_else(std::ptr::null_mut) } #[no_mangle] diff --git a/src/accounts.rs b/src/accounts.rs index 632d38cda..679e6ff65 100644 --- a/src/accounts.rs +++ b/src/accounts.rs @@ -65,14 +65,9 @@ impl Accounts { } /// Get the currently selected account. - pub async fn get_selected_account(&self) -> Context { + pub async fn get_selected_account(&self) -> Option { let id = self.config.get_selected_account().await; - self.accounts - .read() - .await - .get(&id) - .cloned() - .expect("inconsistent state") + self.accounts.read().await.get(&id).cloned() } /// Select the given account. @@ -509,7 +504,7 @@ mod tests { assert_eq!(accounts.accounts.read().await.len(), 1); assert_eq!(accounts.config.get_selected_account().await, 1); - let ctx = accounts.get_selected_account().await; + let ctx = accounts.get_selected_account().await.unwrap(); assert_eq!( "me@mail.com", ctx.get_config(crate::config::Config::Addr) @@ -581,7 +576,7 @@ mod tests { let (id0_reopened, id1_reopened, id2_reopened) = { let accounts = Accounts::new("my_os".into(), p.clone()).await?; - let ctx = accounts.get_selected_account().await; + let ctx = accounts.get_selected_account().await.unwrap(); assert_eq!( ctx.get_config(crate::config::Config::Addr).await?, Some("two@example.org".to_string())