From dcf9a1f5d5349a743f57460fe77f92d9f4631699 Mon Sep 17 00:00:00 2001 From: czh <2565523901@qq.com> Date: Mon, 9 Mar 2026 19:05:45 +0800 Subject: [PATCH] feat: add input validation for scheduler options Add validation for critical scheduler parameters: - desired_retention must be between 0.0 and 1.0 (exclusive) - maximum_interval must be a positive integer (>= 1) - Provide clear error messages with actual values received This prevents misconfiguration and provides early feedback on invalid scheduler settings. --- lib/lulucat/fsrs_scheduler.ex | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/lib/lulucat/fsrs_scheduler.ex b/lib/lulucat/fsrs_scheduler.ex index 2410a3d..bd034e8 100644 --- a/lib/lulucat/fsrs_scheduler.ex +++ b/lib/lulucat/fsrs_scheduler.ex @@ -81,6 +81,10 @@ defmodule Fsrs.Scheduler do validate_parameters!(parameters) desired_retention = Keyword.get(opts, :desired_retention, 0.9) + validate_desired_retention!(desired_retention) + + maximum_interval = Keyword.get(opts, :maximum_interval, 36500) + validate_maximum_interval!(maximum_interval) # Convert learning_steps and relearning_steps from timedeltas to seconds # 将 learning_steps 和 relearning_steps 从时间增量转换为秒 @@ -855,4 +859,20 @@ defmodule Fsrs.Scheduler do raise ArgumentError, "invalid #{field_name} entry: #{inspect(step)}; expected seconds or {:seconds|:minutes, value}" end + + # Validation helpers + + defp validate_desired_retention!(value) do + unless is_number(value) and value > 0.0 and value < 1.0 do + raise ArgumentError, + "desired_retention must be between 0.0 and 1.0 (exclusive), got: #{inspect(value)}" + end + end + + defp validate_maximum_interval!(value) do + unless is_integer(value) and value >= 1 do + raise ArgumentError, + "maximum_interval must be a positive integer (>= 1), got: #{inspect(value)}" + end + end end