From 2ce1b313bf380683a73516d4c65c11bcf12be0c5 Mon Sep 17 00:00:00 2001 From: RumovZ Date: Thu, 14 Jul 2022 11:00:51 +0200 Subject: [PATCH] Add day limits to DeckNormal --- proto/anki/decks.proto | 8 +++++++- rslib/build/protobuf.rs | 1 + rslib/src/decks/limits.rs | 31 +++++++++++++++++++++++++++++-- rslib/src/decks/schema11.rs | 2 ++ 4 files changed, 39 insertions(+), 3 deletions(-) diff --git a/proto/anki/decks.proto b/proto/anki/decks.proto index 1380afee1..97c4dfb7d 100644 --- a/proto/anki/decks.proto +++ b/proto/anki/decks.proto @@ -64,6 +64,10 @@ message Deck { bytes other = 255; } message Normal { + message DayLimit { + uint32 limit = 1; + uint32 today = 2; + } int64 config_id = 1; uint32 extend_new = 2; uint32 extend_review = 3; @@ -71,8 +75,10 @@ message Deck { bool markdown_description = 5; optional uint32 review_limit = 6; optional uint32 new_limit = 7; + DayLimit review_limit_today = 8; + DayLimit new_limit_today = 9; - reserved 8 to 11; + reserved 12 to 15; } message Filtered { message SearchTerm { diff --git a/rslib/build/protobuf.rs b/rslib/build/protobuf.rs index 55252fd00..8d4ea9480 100644 --- a/rslib/build/protobuf.rs +++ b/rslib/build/protobuf.rs @@ -105,6 +105,7 @@ pub fn write_backend_proto_rs() { "Deck.Filtered.SearchTerm.Order", "#[derive(strum::EnumIter)]", ) + .type_attribute("Deck.Normal.DayLimit", "#[derive(Copy)]") .type_attribute("HelpPageLinkRequest.HelpPage", "#[derive(strum::EnumIter)]") .type_attribute("CsvMetadata.Delimiter", "#[derive(strum::EnumIter)]") .type_attribute( diff --git a/rslib/src/decks/limits.rs b/rslib/src/decks/limits.rs index 3c71a1a4c..40579511b 100644 --- a/rslib/src/decks/limits.rs +++ b/rslib/src/decks/limits.rs @@ -8,9 +8,32 @@ use id_tree::{InsertBehavior, Node, NodeId, Tree}; use super::{Deck, NormalDeck}; use crate::{ deckconfig::{DeckConfig, DeckConfigId}, + pb::decks::deck::normal::DayLimit, prelude::*, }; +impl NormalDeck { + /// The deck's review limit for today or its general one, if any is configured. + pub fn day_review_limit(&self, today: u32) -> Option { + self.review_limit_today + .and_then(|day_limit| day_limit.limit(today)) + .or(self.review_limit) + } + + /// The deck's new limit for today or its general one, if any is configured. + pub fn day_new_limit(&self, today: u32) -> Option { + self.new_limit_today + .and_then(|day_limit| day_limit.limit(today)) + .or(self.new_limit) + } +} + +impl DayLimit { + pub fn limit(&self, today: u32) -> Option { + (self.today == today).then(|| self.limit) + } +} + #[derive(Clone, Copy, Debug, PartialEq)] pub(crate) struct RemainingLimits { pub review: u32, @@ -34,8 +57,12 @@ impl RemainingLimits { normal: &NormalDeck, config: &DeckConfig, ) -> RemainingLimits { - let review_limit = normal.review_limit.unwrap_or(config.inner.reviews_per_day); - let new_limit = normal.new_limit.unwrap_or(config.inner.new_per_day); + let review_limit = normal + .day_review_limit(today) + .unwrap_or(config.inner.reviews_per_day); + let new_limit = normal + .day_new_limit(today) + .unwrap_or(config.inner.new_per_day); let (new_today, mut rev_today) = deck.new_rev_counts(today); if v3 { // any reviewed new cards contribute to the review limit diff --git a/rslib/src/decks/schema11.rs b/rslib/src/decks/schema11.rs index 7101ea1cb..72068c287 100644 --- a/rslib/src/decks/schema11.rs +++ b/rslib/src/decks/schema11.rs @@ -306,6 +306,8 @@ impl From for NormalDeck { description: deck.common.desc, review_limit: deck.review_limit, new_limit: deck.new_limit, + review_limit_today: None, + new_limit_today: None, } } }