music_player_client/
library.rs1use 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}