Add custom error type for the backend

This commit is contained in:
Elias Projahn 2021-02-04 16:31:37 +01:00
parent 4ad7a1fb28
commit 5a41d5008f
14 changed files with 44 additions and 44 deletions

View file

@ -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.

View file

@ -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.

View file

@ -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

View file

@ -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<String> {
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<LoginData> {
self.login_data.borrow().clone()
}
fn login_data(&self) -> Result<LoginData> {
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<bool> {
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<String> {
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<Response<Body>> {
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))

View file

@ -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.

View file

@ -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.

View file

@ -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<bool> {
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))

View file

@ -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.

View file

@ -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;

View file

@ -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::*;

View file

@ -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)

View file

@ -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;

View file

@ -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;