diff --git a/src-tauri/src/export.rs b/src-tauri/src/export.rs index 7137ea9..3adc51b 100644 --- a/src-tauri/src/export.rs +++ b/src-tauri/src/export.rs @@ -165,7 +165,7 @@ mod tests { use crate::{ bounds::WorkloadBounds, config::UserConfig, resident::Resident, schedule::MonthlySchedule, - scheduler::Scheduler, slot::Slot, + scheduler::Scheduler, }; #[fixture] diff --git a/src-tauri/src/scheduler.rs b/src-tauri/src/scheduler.rs index 6445ac6..c04fc64 100644 --- a/src-tauri/src/scheduler.rs +++ b/src-tauri/src/scheduler.rs @@ -67,15 +67,17 @@ impl Scheduler { } /// Return all valid residents for the current slot - pub fn valid_residents(&self, slot: Slot, schedule: &MonthlySchedule) -> Vec { - let other_slot_resident_id = schedule.get_resident_id(&slot.other_position()); + pub fn valid_residents(&self, slot: Slot, schedule: &MonthlySchedule) -> Vec<&ResidentId> { + let required_type = slot.shift_type(); // Calculate once here + let other_resident = schedule.get_resident_id(&slot.other_position()); self.config .residents .iter() - .filter(|r| Some(&r.id) != other_slot_resident_id) + .filter(|r| Some(&r.id) != other_resident) .filter(|r| !r.negative_shifts.contains(&slot.day)) - .map(|r| r.id.clone()) + .filter(|r| r.allowed_types.contains(&required_type)) + .map(|r| &r.id) .collect() } } diff --git a/src-tauri/src/slot.rs b/src-tauri/src/slot.rs index 96cde30..f23805e 100644 --- a/src-tauri/src/slot.rs +++ b/src-tauri/src/slot.rs @@ -1,6 +1,8 @@ use chrono::{Datelike, NaiveDate, Weekday}; use serde::{Deserialize, Serialize}; +use crate::schedule::ShiftType; + #[derive(Serialize, Deserialize, PartialEq, PartialOrd, Ord, Eq, Debug, Hash, Clone, Copy)] #[serde(rename_all = "camelCase")] pub struct Slot { @@ -88,6 +90,14 @@ impl Slot { position: other_pos, } } + + pub fn shift_type(&self) -> ShiftType { + match (self.is_open_shift(), self.position) { + (true, ShiftPosition::First) => ShiftType::OpenFirst, + (true, ShiftPosition::Second) => ShiftType::OpenSecond, + (false, _) => ShiftType::Closed, + } + } } impl Default for Slot {