spotify_cli/io/formatters/
pin.rs1use 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}