Krolyxon
Commit bf11d59

rmptuisrcapp.rs

78 lines · 2.1 KB · Rust

1use crate::connection::Connection;
2use crate::list::ContentList;
3use mpd::Client;
4use std::collections::VecDeque;
5
6// Application result type
7pub type AppResult<T> = std::result::Result<T, Box<dyn std::error::Error>>;
8
9/// Application
10#[derive(Debug)]
11pub struct App {
12 /// check if app is running
13 pub running: bool,
14 pub conn: Connection,
15 pub play_deque: ContentList<String>,
16 pub song_list: ContentList<String>,
17 pub queue_list: ContentList<String>,
18 pub pl_list: ContentList<String>,
19}
20
21impl App {
22 pub fn builder(addrs: &str) -> AppResult<Self> {
23 let mut conn = Connection::new(addrs).unwrap();
24 let mut queue = ContentList::new();
25 let mut pl_list = ContentList::new();
26 pl_list.list = Self::get_playlist(&mut conn.conn)?;
27
28 Self::get_queue(&mut conn, &mut queue.list);
29
30 let mut song_list = ContentList::new();
31 song_list.list = conn.songs_filenames.clone();
32
33 Ok(Self {
34 running: true,
35 conn,
36 play_deque: ContentList::new(),
37 song_list,
38 queue_list: ContentList::new(),
39 pl_list,
40 })
41 }
42
43 pub fn tick(&self) {}
44
45 pub fn quit(&mut self) {
46 self.running = false;
47 }
48
49 pub fn get_queue(conn: &mut Connection, vec: &mut Vec<String>) {
50 conn.conn.queue().unwrap().into_iter().for_each(|x| {
51 if let Some(title) = x.title {
52 if let Some(artist) = x.artist {
53 vec.push(format!("{} - {}", artist, title));
54 } else {
55 vec.push(title)
56 }
57 } else {
58 vec.push(x.file)
59 }
60 });
61 }
62
63 pub fn update_queue(&mut self) {
64 self.queue_list.list.clear();
65 Self::get_queue(&mut self.conn, &mut self.queue_list.list);
66 }
67
68 pub fn get_playlist(conn: &mut Client) -> AppResult<Vec<String>> {
69 let list: Vec<String> = conn.playlists()?.iter().map(|p| p.clone().name).collect();
70
71 Ok(list)
72 }
73
74 pub fn update_playlist(&mut self) -> AppResult<()> {
75 Self::get_playlist(&mut self.conn.conn)?;
76 Ok(())
77 }
78}