spotify_cli/cli/commands/
categories.rs

1use crate::endpoints::categories::{
2    get_category_playlists, get_several_browse_categories, get_single_browse_category,
3};
4use crate::io::output::{ErrorKind, Response};
5
6use super::with_client;
7
8pub async fn category_list(limit: u8, offset: u32) -> Response {
9    with_client(|client| async move {
10        match get_several_browse_categories::get_several_browse_categories(
11            &client,
12            Some(limit),
13            Some(offset),
14        )
15        .await
16        {
17            Ok(Some(payload)) => Response::success_with_payload(200, "Browse categories", payload),
18            Ok(None) => Response::success_with_payload(
19                200,
20                "No categories found",
21                serde_json::json!({ "categories": { "items": [] } }),
22            ),
23            Err(e) => Response::from_http_error(&e, "Failed to get categories"),
24        }
25    })
26    .await
27}
28
29pub async fn category_get(category_id: &str) -> Response {
30    let category_id = category_id.to_string();
31
32    with_client(|client| async move {
33        match get_single_browse_category::get_single_browse_category(&client, &category_id).await {
34            Ok(Some(payload)) => Response::success_with_payload(200, "Category details", payload),
35            Ok(None) => Response::err(404, "Category not found", ErrorKind::NotFound),
36            Err(e) => Response::from_http_error(&e, "Failed to get category"),
37        }
38    })
39    .await
40}
41
42pub async fn category_playlists(category_id: &str, limit: u8, offset: u32) -> Response {
43    let category_id = category_id.to_string();
44
45    with_client(|client| async move {
46        match get_category_playlists::get_category_playlists(
47            &client,
48            &category_id,
49            Some(limit),
50            Some(offset),
51        )
52        .await
53        {
54            Ok(Some(payload)) => Response::success_with_payload(
55                200,
56                format!("Playlists for {}", category_id),
57                payload,
58            ),
59            Ok(None) => Response::success_with_payload(
60                200,
61                "No playlists found",
62                serde_json::json!({ "playlists": { "items": [] } }),
63            ),
64            Err(e) => Response::from_http_error(&e, "Failed to get category playlists"),
65        }
66    })
67    .await
68}