sunox 0.0.11

Generate AI music from your terminal via direct Suno web workflows
use crate::api::types::PlaylistInfo;

use super::{base_table, dynamic_table};

pub fn playlists(playlists: &[PlaylistInfo]) {
    let mut table = dynamic_table();
    table.set_header(vec!["ID", "Name", "Public", "Trashed", "Clips"]);

    for playlist in playlists {
        let short_id = if playlist.id.len() > 8 {
            &playlist.id[..8]
        } else {
            &playlist.id
        };
        table.add_row(vec![
            short_id,
            &playlist.name,
            &playlist.is_public.to_string(),
            &playlist.is_trashed.to_string(),
            &playlist.clip_count().to_string(),
        ]);
    }

    println!("{table}");
}

pub fn playlist_detail(playlist: &PlaylistInfo) {
    let mut table = base_table();
    table.set_header(vec!["Field", "Value"]);

    table.add_row(vec!["ID", &playlist.id]);
    table.add_row(vec!["Name", &playlist.name]);
    table.add_row(vec![
        "Description",
        playlist.description.as_deref().unwrap_or("-"),
    ]);
    table.add_row(vec!["Public", &playlist.is_public.to_string()]);
    table.add_row(vec!["Trashed", &playlist.is_trashed.to_string()]);
    table.add_row(vec!["Clips", &playlist.clip_count().to_string()]);
    if let Some(ref image_url) = playlist.image_url {
        table.add_row(vec!["Image URL", image_url]);
    }

    println!("{table}");

    if !playlist.playlist_clips.is_empty() {
        let clips: Vec<_> = playlist
            .playlist_clips
            .iter()
            .filter_map(|entry| entry.clip.clone())
            .collect();
        if !clips.is_empty() {
            super::clips(&clips);
        }
    }
}