use crate::connection::Connection; use crate::list::ContentList; use mpd::Client; use std::collections::VecDeque; // Application result type pub type AppResult = std::result::Result>; /// Application #[derive(Debug)] pub struct App { /// check if app is running pub running: bool, pub conn: Connection, pub play_deque: ContentList, pub song_list: ContentList, pub queue_list: ContentList, pub pl_list: ContentList, } impl App { pub fn builder(addrs: &str) -> AppResult { let mut conn = Connection::new(addrs).unwrap(); let mut queue = ContentList::new(); let mut pl_list = ContentList::new(); pl_list.list = Self::get_playlist(&mut conn.conn)?; Self::get_queue(&mut conn, &mut queue.list); let mut song_list = ContentList::new(); song_list.list = conn.songs_filenames.clone(); Ok(Self { running: true, conn, play_deque: ContentList::new(), song_list, queue_list: ContentList::new(), pl_list, }) } pub fn tick(&self) {} pub fn quit(&mut self) { self.running = false; } pub fn get_queue(conn: &mut Connection, vec: &mut Vec) { conn.conn.queue().unwrap().into_iter().for_each(|x| { if let Some(title) = x.title { if let Some(artist) = x.artist { vec.push(format!("{} - {}", artist, title)); } else { vec.push(title) } } else { vec.push(x.file) } }); } pub fn update_queue(&mut self) { self.queue_list.list.clear(); Self::get_queue(&mut self.conn, &mut self.queue_list.list); } pub fn get_playlist(conn: &mut Client) -> AppResult> { let list: Vec = conn.playlists()?.iter().map(|p| p.clone().name).collect(); Ok(list) } pub fn update_playlist(&mut self) -> AppResult<()> { Self::get_playlist(&mut self.conn.conn)?; Ok(()) } }