music_player_client/
library.rs

1use anyhow::Error;
2use music_player_server::api::{
3    metadata::v1alpha1::{Album, Artist, Track},
4    music::v1alpha1::{
5        library_service_client::LibraryServiceClient, GetAlbumDetailsRequest, GetAlbumsRequest,
6        GetArtistDetailsRequest, GetArtistsRequest, GetTrackDetailsRequest, GetTracksRequest,
7    },
8};
9use tonic::transport::Channel;
10
11pub struct LibraryClient {
12    client: LibraryServiceClient<Channel>,
13}
14
15impl LibraryClient {
16    pub async fn new(host: String, port: u16) -> Result<Self, Error> {
17        let url = format!("tcp://{}:{}", host, port);
18        let client = LibraryServiceClient::connect(url).await?;
19        Ok(Self { client })
20    }
21
22    pub async fn album(&mut self, id: &str) -> Result<Option<Album>, Error> {
23        let request = tonic::Request::new(GetAlbumDetailsRequest { id: id.to_string() });
24        let response = self.client.get_album_details(request).await?;
25        Ok(response.into_inner().album)
26    }
27
28    pub async fn albums(
29        &mut self,
30        filter: Option<String>,
31        offset: i32,
32        limit: i32,
33    ) -> Result<Vec<Album>, Error> {
34        let filter = match filter {
35            Some(filter) => filter,
36            None => "".to_string(),
37        };
38        let request = tonic::Request::new(GetAlbumsRequest {
39            offset,
40            limit,
41            filter,
42        });
43        let response = self.client.get_albums(request).await?;
44        Ok(response.into_inner().albums.into_iter().collect())
45    }
46
47    pub async fn artist(&mut self, id: &str) -> Result<Option<Artist>, Error> {
48        let request = tonic::Request::new(GetArtistDetailsRequest { id: id.to_string() });
49        let response = self.client.get_artist_details(request).await?;
50        Ok(response.into_inner().artist)
51    }
52
53    pub async fn artists(
54        &mut self,
55        filter: Option<String>,
56        offset: i32,
57        limit: i32,
58    ) -> Result<Vec<Artist>, Error> {
59        let filter = match filter {
60            Some(filter) => filter,
61            None => "".to_string(),
62        };
63        let request = tonic::Request::new(GetArtistsRequest {
64            offset,
65            limit,
66            filter,
67        });
68        let response = self.client.get_artists(request).await?;
69        Ok(response.into_inner().artists.into_iter().collect())
70    }
71
72    pub async fn songs(
73        &mut self,
74        filter: Option<String>,
75        offset: i32,
76        limit: i32,
77    ) -> Result<Vec<Track>, Error> {
78        let filter = match filter {
79            Some(filter) => filter,
80            None => "".to_string(),
81        };
82        let request = tonic::Request::new(GetTracksRequest {
83            offset,
84            limit,
85            filter,
86        });
87        let response = self.client.get_tracks(request).await?;
88        Ok(response.into_inner().tracks.into_iter().collect())
89    }
90
91    pub async fn song(&mut self, id: &str) -> Result<Option<Track>, Error> {
92        let request = tonic::Request::new(GetTrackDetailsRequest { id: id.to_string() });
93        let response = self.client.get_track_details(request).await?;
94        Ok(response.into_inner().track)
95    }
96
97    pub async fn search(&mut self, query: &str) -> Result<(), Error> {
98        todo!()
99    }
100}