Krolyxon
Commit 9e2b51c

rmptuisrcapp.rs

103 lines · 2.7 KB · Rust

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