Krolyxon
Commit 4bc03ce

rmptuisrcapp.rs

106 lines · 2.8 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#[derive(Debug, PartialEq, Clone)]
21pub enum SelectedTab {
22 SongList,
23 Queue,
24 Playlists,
25}
26
27impl SelectedTab {
28 fn as_usize(&self) {
29 match self {
30 SelectedTab::SongList => 0,
31 SelectedTab::Queue => 1,
32 SelectedTab::Playlists => 2,
33 };
34 }
35}
36
37impl App {
38 pub fn builder(addrs: &str) -> AppResult<Self> {
39 let mut conn = Connection::new(addrs).unwrap();
40 let mut queue_list = ContentList::new();
41 let mut pl_list = ContentList::new();
42 pl_list.list = Self::get_playlist(&mut conn.conn)?;
43
44 Self::get_queue(&mut conn, &mut queue_list.list);
45
46 let mut song_list = ContentList::new();
47 song_list.list = conn.songs_filenames.clone();
48
49 Ok(Self {
50 running: true,
51 conn,
52 song_list,
53 queue_list,
54 pl_list,
55 selected_tab: SelectedTab::SongList,
56 })
57 }
58
59 pub fn tick(&self) {}
60
61 pub fn quit(&mut self) {
62 self.running = false;
63 }
64
65 pub fn get_queue(conn: &mut Connection, vec: &mut Vec<String>) {
66 // conn.conn.queue().unwrap().into_iter().for_each(|x| {
67 // if let Some(title) = x.title {
68 // if let Some(artist) = x.artist {
69 // vec.push(format!("{} - {}", artist, title));
70 // } else {
71 // vec.push(title)
72 // }
73 // } else {
74 // vec.push(x.file)
75 // }
76 // });
77 conn.conn.queue().unwrap().into_iter().for_each(|x| {
78 vec.push(x.file);
79 }
80 );
81 }
82
83 pub fn update_queue(&mut self) {
84 self.queue_list.list.clear();
85 Self::get_queue(&mut self.conn, &mut self.queue_list.list);
86 }
87
88 pub fn get_playlist(conn: &mut Client) -> AppResult<Vec<String>> {
89 let list: Vec<String> = conn.playlists()?.iter().map(|p| p.clone().name).collect();
90
91 Ok(list)
92 }
93
94 pub fn update_playlist(&mut self) -> AppResult<()> {
95 Self::get_playlist(&mut self.conn.conn)?;
96 Ok(())
97 }
98
99 pub fn cycle_tabls(&mut self) {
100 self.selected_tab = match self.selected_tab {
101 SelectedTab::SongList => SelectedTab::Queue,
102 SelectedTab::Queue => SelectedTab::Playlists,
103 SelectedTab::Playlists => SelectedTab::SongList,
104 };
105 }
106}