From 5a41d5008f2e723d6adccac7acf1cf522e5c0389 Mon Sep 17 00:00:00 2001 From: Elias Projahn Date: Thu, 4 Feb 2021 16:31:37 +0100 Subject: [PATCH] Add custom error type for the backend --- Cargo.toml | 1 + src/backend/client/ensembles.rs | 3 +-- src/backend/client/instruments.rs | 3 +-- src/backend/client/mediums.rs | 3 +-- src/backend/client/mod.rs | 29 ++++++++++++++++++----------- src/backend/client/persons.rs | 3 +-- src/backend/client/recordings.rs | 3 +-- src/backend/client/register.rs | 5 ++--- src/backend/client/works.rs | 3 +-- src/backend/library.rs | 3 +-- src/backend/mod.rs | 4 +++- src/backend/player.rs | 23 +++++++++++------------ src/backend/secure.rs | 3 +-- src/selectors/selector.rs | 2 +- 14 files changed, 44 insertions(+), 44 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index ee06113..0bba97b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,6 +22,7 @@ rand = "0.7.3" secret-service = "2.0.1" serde = { version = "1.0.117", features = ["derive"] } serde_json = "1.0.59" +thiserror = "1.0.23" uuid = { version = "0.8", features = ["v4"] } [dependencies.gdk] diff --git a/src/backend/client/ensembles.rs b/src/backend/client/ensembles.rs index 20b9ea6..ed7cd3d 100644 --- a/src/backend/client/ensembles.rs +++ b/src/backend/client/ensembles.rs @@ -1,5 +1,4 @@ -use crate::backend::{Backend, Ensemble}; -use anyhow::Result; +use crate::backend::{Backend, Ensemble, Result}; impl Backend { /// Get all available ensembles from the server. diff --git a/src/backend/client/instruments.rs b/src/backend/client/instruments.rs index 18f0178..0e2b3ce 100644 --- a/src/backend/client/instruments.rs +++ b/src/backend/client/instruments.rs @@ -1,5 +1,4 @@ -use crate::backend::{Backend, Instrument}; -use anyhow::Result; +use crate::backend::{Backend, Instrument, Result}; impl Backend { /// Get all available instruments from the server. diff --git a/src/backend/client/mediums.rs b/src/backend/client/mediums.rs index fb9dc46..f346e5c 100644 --- a/src/backend/client/mediums.rs +++ b/src/backend/client/mediums.rs @@ -1,5 +1,4 @@ -use crate::backend::{Backend, Medium}; -use anyhow::Result; +use crate::backend::{Backend, Medium, Result}; impl Backend { /// Get all available mediums from the server, that contain the specified diff --git a/src/backend/client/mod.rs b/src/backend/client/mod.rs index f4a45f5..f87e69b 100644 --- a/src/backend/client/mod.rs +++ b/src/backend/client/mod.rs @@ -1,6 +1,4 @@ -use super::secure; -use super::Backend; -use anyhow::{anyhow, bail, Result}; +use crate::backend::{Backend, Error, Result, secure}; use gio::prelude::*; use isahc::http::StatusCode; use isahc::prelude::*; @@ -74,11 +72,20 @@ impl Backend { self.server_url.borrow().clone() } + /// Require the server URL to be set. + fn server_url(&self) -> Result { + self.get_server_url().ok_or(Error::Other("The server URL is not available!")) + } + /// Get the currently stored login credentials. pub fn get_login_data(&self) -> Option { self.login_data.borrow().clone() } + fn login_data(&self) -> Result { + self.get_login_data().ok_or(Error::Other("The login data is unset!")) + } + /// Set the user credentials to use. pub async fn set_login_data(&self, data: LoginData) -> Result<()> { secure::store_login_data(data.clone()).await?; @@ -89,8 +96,8 @@ impl Backend { /// Try to login a user with the provided credentials and return, wether the login suceeded. pub async fn login(&self) -> Result { - let server_url = self.get_server_url().ok_or(anyhow!("No server URL set!"))?; - let data = self.get_login_data().ok_or(anyhow!("No login data set!"))?; + let server_url = self.server_url()?; + let data = self.login_data()?; let request = Request::post(format!("{}/login", server_url)) .timeout(Duration::from_secs(10)) @@ -106,7 +113,7 @@ impl Backend { true } StatusCode::UNAUTHORIZED => false, - _ => bail!("Unexpected response status!"), + status_code => Err(Error::UnexpectedResponse(status_code))?, }; Ok(success) @@ -114,7 +121,7 @@ impl Backend { /// Make an unauthenticated get request to the server. async fn get(&self, url: &str) -> Result { - let server_url = self.get_server_url().ok_or(anyhow!("No server URL set!"))?; + let server_url = self.server_url()?; let mut response = Request::get(format!("{}/{}", server_url, url)) .timeout(Duration::from_secs(10)) @@ -138,7 +145,7 @@ impl Backend { if self.login().await? { response = self.post_priv(url, body).await?; } else { - bail!("Login failed!"); + Err(Error::LoginFailed)?; } } @@ -148,7 +155,7 @@ impl Backend { let mut response = if self.login().await? { self.post_priv(url, body).await? } else { - bail!("Login failed!"); + Err(Error::LoginFailed)? }; response.text_async().await? @@ -160,8 +167,8 @@ impl Backend { /// Post something to the server assuming there is a valid login token. async fn post_priv(&self, url: &str, body: String) -> Result> { - let server_url = self.get_server_url().ok_or(anyhow!("No server URL set!"))?; - let token = self.get_token().ok_or(anyhow!("No login token!"))?; + let server_url = self.server_url()?; + let token = self.get_token().ok_or(Error::Other("No login token found!"))?; let response = Request::post(format!("{}/{}", server_url, url)) .timeout(Duration::from_secs(10)) diff --git a/src/backend/client/persons.rs b/src/backend/client/persons.rs index 6bc0200..86aa9bd 100644 --- a/src/backend/client/persons.rs +++ b/src/backend/client/persons.rs @@ -1,5 +1,4 @@ -use crate::backend::{Backend, Person}; -use anyhow::Result; +use crate::backend::{Backend, Person, Result}; impl Backend { /// Get all available persons from the server. diff --git a/src/backend/client/recordings.rs b/src/backend/client/recordings.rs index 0bfe382..6fb7a69 100644 --- a/src/backend/client/recordings.rs +++ b/src/backend/client/recordings.rs @@ -1,5 +1,4 @@ -use crate::backend::{Backend, Recording}; -use anyhow::Result; +use crate::backend::{Backend, Recording, Result}; impl Backend { /// Get all available recordings from the server. diff --git a/src/backend/client/register.rs b/src/backend/client/register.rs index bfe639e..ee4b3b6 100644 --- a/src/backend/client/register.rs +++ b/src/backend/client/register.rs @@ -1,5 +1,4 @@ -use super::Backend; -use anyhow::{anyhow, Result}; +use crate::backend::{Backend, Result}; use isahc::http::StatusCode; use isahc::prelude::*; use serde::{Deserialize, Serialize}; @@ -35,7 +34,7 @@ impl Backend { /// Register a new user and return whether the process suceeded. This will /// not store the new login credentials. pub async fn register(&self, data: UserRegistration) -> Result { - let server_url = self.get_server_url().ok_or(anyhow!("No server URL set!"))?; + let server_url = self.server_url()?; let mut response = Request::post(format!("{}/users", server_url)) .timeout(Duration::from_secs(10)) diff --git a/src/backend/client/works.rs b/src/backend/client/works.rs index 2c6bc98..5608f36 100644 --- a/src/backend/client/works.rs +++ b/src/backend/client/works.rs @@ -1,5 +1,4 @@ -use crate::backend::{Backend, Work}; -use anyhow::Result; +use crate::backend::{Backend, Result, Work}; impl Backend { /// Get all available works from the server. diff --git a/src/backend/library.rs b/src/backend/library.rs index 51a4e7c..eef75e2 100644 --- a/src/backend/library.rs +++ b/src/backend/library.rs @@ -1,5 +1,4 @@ -use super::{Backend, BackendState, DbThread, Player}; -use anyhow::Result; +use crate::backend::{Backend, BackendState, DbThread, Player, Result}; use gio::prelude::*; use std::path::PathBuf; use std::rc::Rc; diff --git a/src/backend/mod.rs b/src/backend/mod.rs index 4269e8d..bbf2426 100644 --- a/src/backend/mod.rs +++ b/src/backend/mod.rs @@ -1,4 +1,3 @@ -use anyhow::Result; use futures_channel::mpsc; use std::cell::RefCell; use std::path::PathBuf; @@ -10,6 +9,9 @@ pub use client::*; pub mod database; pub use database::*; +pub mod error; +pub use error::*; + pub mod library; pub use library::*; diff --git a/src/backend/player.rs b/src/backend/player.rs index a47d9ee..060c5e7 100644 --- a/src/backend/player.rs +++ b/src/backend/player.rs @@ -1,6 +1,4 @@ -use crate::backend::TrackSet; -use anyhow::anyhow; -use anyhow::Result; +use crate::backend::{Error, Result, TrackSet}; use gstreamer_player::prelude::*; use std::cell::{Cell, RefCell}; use std::path::PathBuf; @@ -122,9 +120,7 @@ impl Player { pub fn add_item(&self, item: PlaylistItem) -> Result<()> { if item.indices.is_empty() { - Err(anyhow!( - "Tried to add playlist item without tracks to playlist!" - )) + Err(Error::Other("Tried to add an empty playlist item!")) } else { let was_empty = { let mut playlist = self.playlist.borrow_mut(); @@ -188,11 +184,13 @@ impl Player { } pub fn previous(&self) -> Result<()> { - let mut current_item = self.current_item.get().ok_or(anyhow!("No current item!"))?; + let mut current_item = self.current_item.get() + .ok_or(Error::Other("Player tried to access non existant current item."))?; + let mut current_track = self .current_track .get() - .ok_or(anyhow!("No current track!"))?; + .ok_or(Error::Other("Player tried to access non existant current track."))?; let playlist = self.playlist.borrow(); if current_track > 0 { @@ -201,7 +199,7 @@ impl Player { current_item -= 1; current_track = playlist[current_item].indices.len() - 1; } else { - return Err(anyhow!("No previous track!")); + return Err(Error::Other("No existing previous track.")); } self.set_track(current_item, current_track) @@ -223,11 +221,12 @@ impl Player { } pub fn next(&self) -> Result<()> { - let mut current_item = self.current_item.get().ok_or(anyhow!("No current item!"))?; + let mut current_item = self.current_item.get() + .ok_or(Error::Other("Player tried to access non existant current item."))?; let mut current_track = self .current_track .get() - .ok_or(anyhow!("No current track!"))?; + .ok_or(Error::Other("Player tried to access non existant current track."))?; let playlist = self.playlist.borrow(); let item = &playlist[current_item]; @@ -237,7 +236,7 @@ impl Player { current_item += 1; current_track = 0; } else { - return Err(anyhow!("No next track!")); + return Err(Error::Other("No existing previous track.")); } self.set_track(current_item, current_track) diff --git a/src/backend/secure.rs b/src/backend/secure.rs index 508541d..5950651 100644 --- a/src/backend/secure.rs +++ b/src/backend/secure.rs @@ -1,5 +1,4 @@ -use crate::backend::LoginData; -use anyhow::Result; +use crate::backend::{LoginData, Result}; use futures_channel::oneshot; use secret_service::{Collection, EncryptionType, SecretService}; use std::collections::HashMap; diff --git a/src/selectors/selector.rs b/src/selectors/selector.rs index b6d27b5..a7bea92 100644 --- a/src/selectors/selector.rs +++ b/src/selectors/selector.rs @@ -1,5 +1,5 @@ +use crate::backend::Result; use crate::widgets::List; -use anyhow::Result; use glib::clone; use gtk::prelude::*; use gtk_macros::get_widget;