use std::borrow::Cow;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use crate::app::App;
use crate::card::CardInner;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Scores {
#[serde(default)]
pub scores: Vec<(CardInner, usize)>,
#[serde(default)]
pub dues: Vec<(CardInner, DateTime<Utc>)>,
#[serde(default)]
pub circulating: Vec<CardInner>,
}
impl<'a> From<&'a App> for Scores {
fn from(app: &App) -> Self {
Self {
scores: {
let mut scores = Vec::new();
for card in app.cards() {
scores.push((Cow::Borrowed(card).inner.clone(), card.score));
}
scores
},
dues: {
let mut dues = Vec::new();
for card in app.cards() {
dues.push((
Cow::Borrowed(card).inner.clone(),
card.due_date.unwrap_or(Utc::now()),
));
}
dues
},
circulating: {
let mut circulating = Vec::new();
for card in app.circulating() {
if let Some(card) = app.cards().get(*card) {
circulating.push(Cow::Borrowed(card).inner.clone())
}
}
circulating
},
}
}
}