spotify-cli 0.5.0

A command-line interface for Spotify
Documentation
use crate::endpoints::categories::{
    get_category_playlists, get_several_browse_categories, get_single_browse_category,
};
use crate::io::output::{ErrorKind, Response};

use super::with_client;

pub async fn category_list(limit: u8, offset: u32) -> Response {
    with_client(|client| async move {
        match get_several_browse_categories::get_several_browse_categories(
            &client,
            Some(limit),
            Some(offset),
        )
        .await
        {
            Ok(Some(payload)) => Response::success_with_payload(200, "Browse categories", payload),
            Ok(None) => Response::success_with_payload(
                200,
                "No categories found",
                serde_json::json!({ "categories": { "items": [] } }),
            ),
            Err(e) => Response::from_http_error(&e, "Failed to get categories"),
        }
    })
    .await
}

pub async fn category_get(category_id: &str) -> Response {
    let category_id = category_id.to_string();

    with_client(|client| async move {
        match get_single_browse_category::get_single_browse_category(&client, &category_id).await {
            Ok(Some(payload)) => Response::success_with_payload(200, "Category details", payload),
            Ok(None) => Response::err(404, "Category not found", ErrorKind::NotFound),
            Err(e) => Response::from_http_error(&e, "Failed to get category"),
        }
    })
    .await
}

pub async fn category_playlists(category_id: &str, limit: u8, offset: u32) -> Response {
    let category_id = category_id.to_string();

    with_client(|client| async move {
        match get_category_playlists::get_category_playlists(
            &client,
            &category_id,
            Some(limit),
            Some(offset),
        )
        .await
        {
            Ok(Some(payload)) => Response::success_with_payload(
                200,
                format!("Playlists for {}", category_id),
                payload,
            ),
            Ok(None) => Response::success_with_payload(
                200,
                "No playlists found",
                serde_json::json!({ "playlists": { "items": [] } }),
            ),
            Err(e) => Response::from_http_error(&e, "Failed to get category playlists"),
        }
    })
    .await
}