chore: collect structured GetUserMusicApiResp
This commit is contained in:
@@ -5,21 +5,21 @@ use crate::{
|
|||||||
title::{
|
title::{
|
||||||
MaiVersionExt as _, Sdgb1_50,
|
MaiVersionExt as _, Sdgb1_50,
|
||||||
methods::APIMethod,
|
methods::APIMethod,
|
||||||
model::{GetUserMusicApi, GetUserMusicApiResp, UserMusicDetail},
|
model::{GetUserMusicApi, GetUserMusicApiResp},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
pub async fn get_user_all_music(
|
pub async fn get_user_all_music(
|
||||||
client: &AsyncClient,
|
client: &AsyncClient,
|
||||||
user_id: u32,
|
user_id: u32,
|
||||||
) -> Result<Vec<UserMusicDetail>, ApiError> {
|
) -> Result<GetUserMusicApiResp, ApiError> {
|
||||||
let mut music_detail = Vec::new();
|
let mut user_music_list = Vec::new();
|
||||||
let mut index = None;
|
let mut index = None;
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let GetUserMusicApiResp {
|
let GetUserMusicApiResp {
|
||||||
next_index,
|
next_index,
|
||||||
mut user_music_list,
|
user_music_list: mut new_list,
|
||||||
..
|
..
|
||||||
} = Sdgb1_50::request::<_, GetUserMusicApiResp>(
|
} = Sdgb1_50::request::<_, GetUserMusicApiResp>(
|
||||||
&client,
|
&client,
|
||||||
@@ -33,13 +33,23 @@ pub async fn get_user_all_music(
|
|||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
for list in &mut user_music_list {
|
if new_list.is_empty() {
|
||||||
music_detail.append(&mut list.user_music_detail_list);
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if next_index == 0 || user_music_list.is_empty() {
|
user_music_list.append(&mut new_list);
|
||||||
break Ok(music_detail);
|
|
||||||
|
if next_index == 0 {
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
index = Some(next_index);
|
index = Some(next_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ok(GetUserMusicApiResp {
|
||||||
|
user_id,
|
||||||
|
next_index: 0,
|
||||||
|
length: user_music_list.len() as _,
|
||||||
|
user_music_list,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ pub struct GetUserMusicApi {
|
|||||||
pub max_count: u32,
|
pub max_count: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
|
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize, Encode, Decode)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
pub struct GetUserMusicApiResp {
|
pub struct GetUserMusicApiResp {
|
||||||
pub user_id: u32,
|
pub user_id: u32,
|
||||||
@@ -26,7 +26,7 @@ pub struct GetUserMusicApiResp {
|
|||||||
pub user_music_list: Vec<UserMusic>,
|
pub user_music_list: Vec<UserMusic>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
|
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize, Encode, Decode)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
pub struct UserMusic {
|
pub struct UserMusic {
|
||||||
pub user_music_detail_list: Vec<UserMusicDetail>,
|
pub user_music_detail_list: Vec<UserMusicDetail>,
|
||||||
|
|||||||
@@ -80,21 +80,27 @@ async fn main() -> Result<(), Box<dyn snafu::Error>> {
|
|||||||
match command {
|
match command {
|
||||||
Commands::MusicDetail { user_id, format } => {
|
Commands::MusicDetail { user_id, format } => {
|
||||||
let music_detail = get_user_all_music(&client, user_id).await?;
|
let music_detail = get_user_all_music(&client, user_id).await?;
|
||||||
|
let details = music_detail
|
||||||
|
.user_music_list
|
||||||
|
.iter()
|
||||||
|
.map(|m| &m.user_music_detail_list)
|
||||||
|
.flatten();
|
||||||
|
|
||||||
match (human_readable, format) {
|
match (human_readable, format) {
|
||||||
(true, _) => {
|
(true, _) => {
|
||||||
for detail in &music_detail {
|
let mut count = 0;
|
||||||
|
for detail in details {
|
||||||
println!("{detail}");
|
println!("{detail}");
|
||||||
println!("----------");
|
println!("----------");
|
||||||
|
count += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
println!("共查询到 {} 条记录!", music_detail.len());
|
println!("共查询到 {count} 条记录!");
|
||||||
}
|
}
|
||||||
(false, RatingFormat::Origin) => json_display(music_detail)?,
|
(false, RatingFormat::Origin) => json_display(music_detail)?,
|
||||||
(false, RatingFormat::DxRatingNet) => {
|
(false, RatingFormat::DxRatingNet) => {
|
||||||
let dx_export = Vec::from_iter(
|
let dx_export = Vec::from_iter(
|
||||||
music_detail
|
details
|
||||||
.iter()
|
|
||||||
.map(|music| {
|
.map(|music| {
|
||||||
DxMusicRecord::try_from(music).inspect_err(|e| {
|
DxMusicRecord::try_from(music).inspect_err(|e| {
|
||||||
warn!("failed to process {}: {e}", music.music_id)
|
warn!("failed to process {}: {e}", music.music_id)
|
||||||
|
|||||||
Reference in New Issue
Block a user