rsoundcloud/api/
search.rs1use async_trait::async_trait;
2
3use crate::{client::SoundCloudClient, http::build_query, models::{track::Track, SearchItem}, utils::schemas::CollectionParams, ClientResult};
4
5use super::{convert_collection, convert_search_items};
6
7#[async_trait]
8pub trait SearchApi {
9
10 async fn search(&self, query: String, collection_params: CollectionParams) -> ClientResult<Vec<SearchItem>>;
12
13 async fn search_tracks(&self, query: String, collection_params: CollectionParams) -> ClientResult<Vec<SearchItem>>;
15
16 async fn search_users(&self, query: String, collection_params: CollectionParams) -> ClientResult<Vec<SearchItem>>;
18
19 async fn search_albums(&self, query: String, collection_params: CollectionParams) -> ClientResult<Vec<SearchItem>>;
21
22 async fn search_playlists(&self, query: String, collection_params: CollectionParams) -> ClientResult<Vec<SearchItem>>;
24
25 async fn get_tag_tracks_recent(&self, tag: String, collection_params: CollectionParams) -> ClientResult<Vec<Track>>;
27}
28
29#[async_trait]
30trait SearchApiUtils {
31
32 async fn generic_search(&self, query: String, collection_params: CollectionParams, path: &str) -> ClientResult<Vec<SearchItem>>;
33}
34
35#[async_trait]
36impl SearchApi for SoundCloudClient {
37
38 async fn search(&self, query: String, collection_params: CollectionParams) -> ClientResult<Vec<SearchItem>> {
39 self.generic_search(query, collection_params, "/search").await
40 }
41
42 async fn search_tracks(&self, query: String, collection_params: CollectionParams) -> ClientResult<Vec<SearchItem>> {
43 self.generic_search(query, collection_params, "/search/tracks").await
44 }
45
46 async fn search_users(&self, query: String, collection_params: CollectionParams) -> ClientResult<Vec<SearchItem>> {
47 self.generic_search(query, collection_params, "/search/users").await
48 }
49
50 async fn search_albums(&self, query: String, collection_params: CollectionParams) -> ClientResult<Vec<SearchItem>> {
51 self.generic_search(query, collection_params, "/search/albums").await
52 }
53
54 async fn search_playlists(&self, query: String, collection_params: CollectionParams) -> ClientResult<Vec<SearchItem>> {
55 self.generic_search(query, collection_params, "/search/playlists_without_albums").await
56 }
57
58 async fn get_tag_tracks_recent(&self, tag: String, collection_params: CollectionParams) -> ClientResult<Vec<Track>> {
59 let query_params = collection_params.to_query();
60
61 let result = self.api_get(format!("/recent-tracks/{}", tag).as_str(), query_params).await?;
62 convert_collection(&result)
63 }
64}
65
66#[async_trait]
67impl SearchApiUtils for SoundCloudClient {
68
69 async fn generic_search(&self, query: String, collection_params: CollectionParams, path: &str) -> ClientResult<Vec<SearchItem>> {
70 let mut query_params = build_query([
71 ("q", query.as_str()),
72 ]);
73 collection_params.add_to_query(&mut query_params);
74
75 let result = self.api_get(path, query_params).await?;
76 convert_search_items(&result)
77 }
78}