spotify_cli/io/formatters/
pin.rs

1//! Pin formatting functions
2
3use serde_json::Value;
4
5pub fn format_pins(pins: &[Value]) {
6    if pins.is_empty() {
7        println!("No pins saved.");
8        return;
9    }
10    println!("Pinned Resources:");
11    for pin in pins {
12        let alias = pin
13            .get("alias")
14            .and_then(|v| v.as_str())
15            .unwrap_or("Unknown");
16        let rtype = pin
17            .get("type")
18            .and_then(|v| v.as_str())
19            .unwrap_or("unknown");
20        let tags = pin
21            .get("tags")
22            .and_then(|v| v.as_array())
23            .map(|arr| {
24                arr.iter()
25                    .filter_map(|t| t.as_str())
26                    .collect::<Vec<_>>()
27                    .join(", ")
28            })
29            .unwrap_or_default();
30
31        if tags.is_empty() {
32            println!("  [{}] {}", rtype, alias);
33        } else {
34            println!("  [{}] {} ({})", rtype, alias, tags);
35        }
36    }
37}
38
39#[cfg(test)]
40mod tests {
41    use super::*;
42    use serde_json::json;
43
44    #[test]
45    fn format_pins_empty() {
46        let pins: Vec<Value> = vec![];
47        format_pins(&pins);
48    }
49
50    #[test]
51    fn format_pins_single_without_tags() {
52        let pins = vec![json!({
53            "alias": "favorite",
54            "type": "track"
55        })];
56        format_pins(&pins);
57    }
58
59    #[test]
60    fn format_pins_single_with_tags() {
61        let pins = vec![json!({
62            "alias": "workout mix",
63            "type": "playlist",
64            "tags": ["gym", "energy", "rock"]
65        })];
66        format_pins(&pins);
67    }
68
69    #[test]
70    fn format_pins_multiple() {
71        let pins = vec![
72            json!({ "alias": "chill", "type": "playlist", "tags": ["relax"] }),
73            json!({ "alias": "best song", "type": "track" }),
74            json!({ "alias": "fav artist", "type": "artist", "tags": ["rock", "metal"] }),
75        ];
76        format_pins(&pins);
77    }
78
79    #[test]
80    fn format_pins_minimal_data() {
81        let pins = vec![json!({})];
82        format_pins(&pins);
83    }
84
85    #[test]
86    fn format_pins_empty_tags_array() {
87        let pins = vec![json!({
88            "alias": "test",
89            "type": "album",
90            "tags": []
91        })];
92        format_pins(&pins);
93    }
94}