leetcode-api 0.6.0

leetcode api
Documentation
use serde::{Deserialize, Serialize};

#[derive(Clone)]
#[derive(Debug)]
#[derive(Default)]
#[derive(PartialEq, Eq)]
#[derive(Deserialize, Serialize)]
pub struct Passdata {
    #[serde(default)]
    pub data: PassData,
}

#[derive(Clone)]
#[derive(Debug)]
#[derive(Default)]
#[derive(PartialEq, Eq)]
#[derive(Deserialize, Serialize)]
pub struct DataCom {
    #[serde(default, alias = "allQuestionsCount")]
    all_questions_count: Vec<DifficultyPass>,
    #[serde(default, alias = "matchedUser")]
    matched_user: MatchedUser,
}

impl DataCom {
    fn info(&self) -> Vec<String> {
        let mut res = Vec::with_capacity(4);
        if let Some(v) = &self.matched_user.submit_stats {
            for i in &v.ac_submission_num {
                res.push(format!("{}: {}", i.difficulty, i.count));
            }
        }
        res
    }
}

#[derive(Clone)]
#[derive(Debug)]
#[derive(Default)]
#[derive(PartialEq, Eq)]
#[derive(Deserialize, Serialize)]
pub struct MatchedUser {
    #[serde(default, alias = "submitStats")]
    submit_stats: Option<SubmitStats>,
}
#[derive(Clone)]
#[derive(Debug)]
#[derive(Default)]
#[derive(PartialEq, Eq)]
#[derive(Deserialize, Serialize)]
pub struct SubmitStats {
    #[serde(default, alias = "acSubmissionNum")]
    ac_submission_num: Vec<DifficultyPass>,
    #[serde(default, alias = "totalSubmissionNum")]
    total_submission_num: Vec<DifficultyPass>,
}

#[derive(Clone)]
#[derive(Debug)]
#[derive(PartialEq, Eq)]
#[derive(Serialize, Deserialize)]
#[serde(untagged)]
pub enum PassData {
    Cn(DataCn),
    Com(DataCom),
}

impl PassData {
    pub fn info(&self) -> Vec<String> {
        match self {
            Self::Cn(v) => v
                .user_profile_user_question_progress
                .info(),
            Self::Com(v) => v.info(),
        }
    }
}

impl Default for PassData {
    fn default() -> Self {
        Self::Cn(DataCn::default())
    }
}

#[derive(Clone)]
#[derive(Debug)]
#[derive(Default)]
#[derive(PartialEq, Eq)]
#[derive(Deserialize, Serialize)]
pub struct DataCn {
    #[serde(default, alias = "userProfileUserQuestionProgress")]
    user_profile_user_question_progress: UserProfileUserQuestionProgress,
    #[serde(default, alias = "userProfileUserQuestionSubmitStats")]
    user_profile_user_question_submit_stats: UserProfileUserQuestionSubmitStats,
}

#[derive(Clone)]
#[derive(Debug)]
#[derive(Default)]
#[derive(PartialEq, Eq)]
#[derive(Deserialize, Serialize)]
pub struct UserProfileUserQuestionSubmitStats {
    #[serde(default, alias = "acSubmissionNum")]
    ac_submission_num: Vec<DifficultyPass>,
}

#[derive(Clone)]
#[derive(Debug)]
#[derive(Default)]
#[derive(PartialEq, Eq)]
#[derive(Deserialize, Serialize)]
pub struct UserProfileUserQuestionProgress {
    #[serde(default, alias = "numAcceptedQuestions")]
    num_accepted_questions: Vec<DifficultyPass>,
    #[serde(default, alias = "numFailedQuestions")]
    num_failed_questions: Vec<DifficultyPass>,
    #[serde(default, alias = "numUntouchedQuestions")]
    num_untouched_questions: Vec<DifficultyPass>,
}

impl UserProfileUserQuestionProgress {
    fn info(&self) -> Vec<String> {
        let mut res = Vec::with_capacity(4);
        let mut all = 0;
        for i in &self.num_accepted_questions {
            res.push(format!("{}: {}", i.difficulty, i.count));
            all += i.count;
        }
        res.push(format!("All: {}", all));
        res
    }
}

#[derive(Clone)]
#[derive(Debug)]
#[derive(Default)]
#[derive(PartialEq, Eq)]
#[derive(Deserialize, Serialize)]
pub struct DifficultyPass {
    difficulty: String,
    count: u32,
}