use plate_tool_lib::plate_instances; use plate_tool_lib::plate::PlateFormat; #[derive(Default, Debug, serde::Serialize, serde::Deserialize)] pub struct MainState { /// Stores all plates and transfers /// /// It is not guaranteed that the current_* variables will refer /// to UUIDs that exist in the lists, only that they did at one time. /// This can happen if a plate or transfer is removed and set_* is not called. pub source_plates: Vec, pub destination_plates: Vec, pub transfers: Vec, current_source: Option, current_destination: Option, current_transfer: Option, } impl MainState { pub fn get_current_source(&self) -> Option { self.current_source } pub fn get_current_destination(&self) -> Option { self.current_destination } pub fn get_current_transfer(&self) -> Option { self.current_transfer } pub fn set_current_source(&mut self, id: plate_tool_lib::uuid::Uuid) -> bool { if self.source_plates.iter().map(|x| x.get_uuid()).find(|x| *x == id).is_some() { self.current_source = Some(id); true } else { false } } pub fn set_current_destination(&mut self, id: plate_tool_lib::uuid::Uuid) -> bool { if self.destination_plates.iter().map(|x| x.get_uuid()).find(|x| *x == id).is_some() { self.current_destination = Some(id); true } else { false } } pub fn set_current_transfer(&mut self, id: plate_tool_lib::uuid::Uuid) -> bool { if self.transfers.iter().map(|x| x.get_uuid()).find(|x| *x == id).is_some() { self.current_transfer = Some(id); true } else { false } } pub fn set_no_current_source(&mut self) { self.current_source = None; } pub fn set_no_current_destination(&mut self) { self.current_destination = None; } pub fn set_no_current_transfer(&mut self) { self.current_transfer = None; } } pub fn construct_fake_mainstate() -> MainState { let src_plate: plate_tool_lib::plate_instances::PlateInstance = plate_instances::PlateInstance::new( plate_tool_lib::plate::PlateType::Source, PlateFormat::W96, "src1".to_owned(), ); let dest_plate: plate_tool_lib::plate_instances::PlateInstance = plate_instances::PlateInstance::new( plate_tool_lib::plate::PlateType::Destination, PlateFormat::W96, "dest1".to_owned(), ); let well_a1 = plate_tool_lib::Well { row: 1, col: 1 }; let well_c3 = plate_tool_lib::Well { row: 3, col: 3 }; let well_a5 = plate_tool_lib::Well { row: 1, col: 5 }; let transfer1_region: plate_tool_lib::transfer_region::TransferRegion = plate_tool_lib::transfer_region::TransferRegion { source_plate: src_plate.plate, source_region: plate_tool_lib::transfer_region::Region::Rect(well_a1, well_c3), dest_plate: dest_plate.plate, dest_region: plate_tool_lib::transfer_region::Region::Point(well_a1), interleave_source: (1, 1), interleave_dest: (1, 1), }; let transfer1: plate_tool_lib::transfer::Transfer = plate_tool_lib::transfer::Transfer::new( src_plate.clone(), dest_plate.clone(), transfer1_region, "Shrimp".to_owned(), ); let transfer2_region: plate_tool_lib::transfer_region::TransferRegion = plate_tool_lib::transfer_region::TransferRegion { source_plate: src_plate.plate, source_region: plate_tool_lib::transfer_region::Region::Rect(well_a1, well_c3), dest_plate: dest_plate.plate, dest_region: plate_tool_lib::transfer_region::Region::Point(well_a5), interleave_source: (1, 1), interleave_dest: (2, 2), }; let transfer2: plate_tool_lib::transfer::Transfer = plate_tool_lib::transfer::Transfer::new( src_plate.clone(), dest_plate.clone(), transfer2_region, "Shrimp".to_owned(), ); MainState { source_plates: vec![src_plate], destination_plates: vec![dest_plate], transfers: vec![transfer1, transfer2], current_source: None, current_destination: None, current_transfer: None, } }