11use crate :: utils:: { bytes_to_best_size, pretty_dates, request, write_json_to_file} ;
2- use serde:: { Deserialize , Deserializer , Serialize } ;
2+ use serde:: { Deserialize , Serialize } ;
33use serde_json:: Value ;
4- use std:: { path:: PathBuf , vec } ;
4+ use std:: path:: PathBuf ;
55
6- pub struct DownloadData {
6+ #[ derive( Serialize , Deserialize , Debug , Clone ) ]
7+ pub struct ReleaseData {
78 pub name : String ,
89 pub tag : String ,
910 pub published_at : String ,
@@ -14,16 +15,16 @@ pub struct DownloadData {
1415 pub downloads : i64 ,
1516}
1617
17- impl DownloadData {
18+ impl ReleaseData {
1819 pub fn new (
1920 name : String ,
2021 tag : String ,
2122 published_at : String ,
2223 created_at : String ,
2324 html_url : String ,
2425 body : String ,
25- ) -> DownloadData {
26- DownloadData {
26+ ) -> ReleaseData {
27+ ReleaseData {
2728 name,
2829 tag,
2930 published_at,
@@ -52,6 +53,7 @@ impl DownloadData {
5253 }
5354}
5455
56+ #[ derive( Serialize , Deserialize , Debug , Clone ) ]
5557pub struct Asset {
5658 pub download_url : String ,
5759 pub created_at : String ,
@@ -94,7 +96,7 @@ impl Asset {
9496 }
9597}
9698
97- pub fn downloads_command (
99+ pub fn releases_command (
98100 owner : String ,
99101 repo : String ,
100102 individual : bool ,
@@ -120,17 +122,31 @@ pub fn downloads_command(
120122 let simple_data = simplify_json_release_data ( & json) ;
121123
122124 if all && !display {
123- println ! ( "{:#? }" , json) ;
125+ println ! ( "{}" , serde_json :: to_string_pretty ( & json) . unwrap ( ) ) ;
124126 } else if all && display {
125127 let mut download_count = 0 ;
126- for release in simple_data {
128+ for release in & simple_data {
127129 release. display ( ) ;
128130 download_count += release. downloads ;
129131 }
130132 println ! ( "Total Downloads: {}" , download_count) ;
133+ if link {
134+ println ! ( "Latest Release: {}" , simple_data[ 0 ] . html_url)
135+ }
131136 } else if !all && !display {
132- // if individual, get latest download url, and sum all item count
133- // {download_url: Vec<(String name, String link for each asset of latest)>, html_url: String, download_count: i32}
137+ if individual {
138+ println ! ( "{}" , serde_json:: to_string_pretty( & simple_data) . unwrap( ) ) ;
139+ } else {
140+ let mut overview = simple_data[ 0 ] . clone ( ) ;
141+ let mut download_count = 0 ;
142+ for release in & simple_data {
143+ download_count += release. downloads ;
144+ }
145+
146+ overview. downloads = download_count;
147+
148+ println ! ( "{}" , serde_json:: to_string_pretty( & overview) . unwrap( ) ) ;
149+ }
134150 } else if !all && display {
135151 let mut download_count = 0 ;
136152 for release in & simple_data {
@@ -161,8 +177,8 @@ pub fn downloads_command(
161177 }
162178}
163179
164- fn simplify_json_release_data ( json : & Value ) -> Vec < DownloadData > {
165- let mut download_data: Vec < DownloadData > = Vec :: new ( ) ;
180+ fn simplify_json_release_data ( json : & Value ) -> Vec < ReleaseData > {
181+ let mut download_data: Vec < ReleaseData > = Vec :: new ( ) ;
166182
167183 for release in json. as_array ( ) . unwrap ( ) {
168184 let name = & release[ "name" ] . as_str ( ) . unwrap_or ( "None" ) . to_string ( ) ;
@@ -175,7 +191,7 @@ fn simplify_json_release_data(json: &Value) -> Vec<DownloadData> {
175191 let html_url = & release[ "html_url" ] . as_str ( ) . unwrap_or ( "None" ) . to_string ( ) ;
176192 let body = & release[ "body" ] . as_str ( ) . unwrap_or ( "None" ) . to_string ( ) ;
177193
178- let mut download = DownloadData :: new (
194+ let mut download = ReleaseData :: new (
179195 name. to_string ( ) ,
180196 tag. to_string ( ) ,
181197 pretty_dates ( & published_at) ,
0 commit comments