Krolyxon
Commit 05c4b17

rmptuisrcapp.rs

77 lines · 2.1 KB · Rust

1use crate::connection::{self, 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: VecDeque<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 vec: VecDeque<String> = VecDeque::new();
25 let mut pl_list = ContentList::new();
26 pl_list.list = Self::get_playlist(&mut conn.conn)?;
27 Self::get_queue(&mut conn, &mut vec);
28
29 let mut song_list = ContentList::new();
30 song_list.list = conn.songs_filenames.clone();
31
32 Ok(Self {
33 running: true,
34 conn,
35 play_deque: vec,
36 song_list,
37 queue_list: ContentList::new(),
38 pl_list,
39 })
40 }
41
42 pub fn tick(&self) {}
43
44 pub fn quit(&mut self) {
45 self.running = false;
46 }
47
48 pub fn get_queue(conn: &mut Connection, vec: &mut VecDeque<String>) {
49 conn.conn.queue().unwrap().into_iter().for_each(|x| {
50 if let Some(title) = x.title {
51 if let Some(artist) = x.artist {
52 vec.push_back(format!("{} - {}", artist, title));
53 } else {
54 vec.push_back(title)
55 }
56 } else {
57 vec.push_back(x.file)
58 }
59 });
60 }
61
62 pub fn update_queue(&mut self) {
63 self.play_deque.clear();
64 Self::get_queue(&mut self.conn, &mut self.play_deque);
65 }
66
67 pub fn get_playlist(conn: &mut Client) -> AppResult<Vec<String>> {
68 let list: Vec<String> = conn.playlists()?.iter().map(|p| p.clone().name).collect();
69
70 Ok(list)
71 }
72
73 pub fn update_playlist(&mut self) -> AppResult<()> {
74 Self::get_playlist(&mut self.conn.conn)?;
75 Ok(())
76 }
77}