diff --git a/amadeus/src/app.rs b/amadeus/src/app.rs index 3cc2eceef3c1237a889238a15b274460212410cc..af869c13c7d22c42b3085b94f2c0778654f0a7f7 100644 --- a/amadeus/src/app.rs +++ b/amadeus/src/app.rs @@ -3,7 +3,7 @@ use crate::{ components::{ self, - config::{AmadeusConfig, RemoteConfig}, + config::AmadeusConfig, mainpanel::{history, playlists, queue, search}, modal::*, *, @@ -21,7 +21,7 @@ use iced::{ Application, Command, Element, Event, Length, Renderer, }; use iced_aw::{native::Split, split}; -use lektor_lib::{requests::*, ConnectConfigPtr}; +use lektor_lib::{requests::*, ConnectConfig, ConnectConfigPtr}; use lektor_payloads::{Infos, KId, Kara, KaraFilter, PlayState, PlayStateWithCurrent, Priority}; use lektor_utils::{config::UserConfig, either, log}; use std::{future::Future, sync::Arc}; @@ -130,17 +130,11 @@ impl Amadeus { let cfg = self.connect_config.clone(); let store = self.kara_store.clone(); async move { - stream::iter( - get_history(cfg) - .await - .map_err(|err| log::error!("{err}")) - .unwrap_or_default(), - ) - .then(|id| KaraStore::into_get(store.clone(), id)) - .try_collect() - .await - .map_err(|err| log::error!("{err}")) - .ok() + stream::iter(get_history(cfg).await.unwrap_or_default()) + .then(|id| KaraStore::into_get(store.clone(), id)) + .try_collect() + .await + .ok() } } @@ -148,17 +142,11 @@ impl Amadeus { let cfg = self.connect_config.clone(); let store = self.kara_store.clone(); async move { - stream::iter( - get_playlist_content(cfg, plt) - .await - .map_err(|err| log::error!("{err}")) - .unwrap_or_default(), - ) - .then(|id| KaraStore::into_get(store.clone(), id)) - .try_collect() - .await - .map_err(|err| log::error!("{err}")) - .ok() + stream::iter(get_playlist_content(cfg, plt).await.unwrap_or_default()) + .then(|id| KaraStore::into_get(store.clone(), id)) + .try_collect() + .await + .ok() } } @@ -166,23 +154,23 @@ impl Amadeus { let cfg = self.connect_config.clone(); let store = self.kara_store.clone(); async move { - stream::iter( - get_queue(cfg) - .await - .map_err(|err| log::error!("{err}")) - .unwrap_or_default(), - ) - .then(move |(p, id)| { - let store = store.clone(); - async move { store.get(id).await.map(|kara| (p, kara)) } - }) - .try_collect() - .await - .map_err(|err| log::error!("{err}")) - .ok() + stream::iter(get_queue(cfg).await.unwrap_or_default()) + .then(move |(p, id)| { + let store = store.clone(); + async move { store.get(id).await.map(|kara| (p, kara)) } + }) + .try_collect() + .await + .ok() } } + /// Get a mut reference to the config, clone the thingy if necessary, so other threads can + /// continue a bit with the old configuration. + fn config_mut(&mut self) -> &mut ConnectConfig { + Arc::make_mut(&mut self.connect_config) + } + /// Handle a config message. This is ugly so we put it in another function. fn handle_config_message(&mut self, config: config::Message) -> Command<Message> { if let config::Message::TryConnect = config { @@ -200,54 +188,35 @@ impl Amadeus { ], ) }); - } - - let updated = { - let cfg = Arc::make_mut(&mut self.connect_config); - match &config { - config::Message::HostChanged(host) => match host.as_str().parse() { - Ok(host) => { - cfg.host = host; - true - } - Err(err) => { - log::error!("{err}"); - false - } - }, - config::Message::UserChanged(user) => { - cfg.user = user.as_str().into(); - true - } - config::Message::TokenChanged(token) => { - cfg.token = token.as_str().into(); - true - } - config::Message::SchemeChanged(scheme) => match scheme.parse() { - Ok(scheme) => { - cfg.scheme = scheme; - true - } - Err(_) => false, - }, - config::Message::LoadConfig(config) => { - let RemoteConfig { - host, - scheme, - user: UserConfig { user, token, .. }, - } = &config.connect; - (cfg.host, cfg.scheme) = (*host, *scheme); - (cfg.user, cfg.token) = (user.as_str().into(), token.as_str().into()); - true - } - _ => false, + } else if match &config { + config::Message::HostChanged(host) => host + .as_str() + .parse() + .map(|host| self.config_mut().host = host) + .is_ok(), + config::Message::UserChanged(user) => { + self.config_mut().user = user.as_str().into(); + true } - }; - - if updated { + config::Message::TokenChanged(token) => { + self.config_mut().token = token.as_str().into(); + true + } + config::Message::SchemeChanged(scheme) => scheme + .parse() + .map(|scheme| self.config_mut().scheme = scheme) + .is_ok(), + config::Message::LoadConfig(config) => { + let UserConfig { user, token, .. } = &config.connect.user; + let cfg = self.config_mut(); + (cfg.host, cfg.scheme) = (config.connect.host, config.connect.scheme); + (cfg.user, cfg.token) = (user.as_str().into(), token.as_str().into()); + true + } + _ => false, + } { self.kara_store.update(self.connect_config.clone()) } - self.config.update(config).map(Message::from) } @@ -640,7 +609,7 @@ impl Application for Amadeus { let flag = self.config.amadeus.open_config_if_init_ping_failed; Command::batch([ flag.then(|| self.update(Message::MainPanelDisplay(MainPanelDisplay::Config))) - .unwrap_or_else(|| Command::none()), + .unwrap_or_else(Command::none), Command::perform(async {}, |_| { Message::from_iter([ Message::ConfigMessage(config::Message::Infos(None)), diff --git a/amadeus/src/components/mainpanel/playlists.rs b/amadeus/src/components/mainpanel/playlists.rs index 9f1d0549629b6c42b8730bcabc6452af511e62d2..9c02680ed643bc2264a6536968b1cee6b84c04e7 100644 --- a/amadeus/src/components/mainpanel/playlists.rs +++ b/amadeus/src/components/mainpanel/playlists.rs @@ -113,7 +113,7 @@ impl State { match self.to_show { Some(ref show) => (!self.contains(show)) .then(|| Command::perform(async {}, |_| Request::ChangeView)) - .unwrap_or_else(|| Command::none()), + .unwrap_or_else(Command::none), _ => Command::none(), } }