use hashbrown::HashMap;
use super::Comparisons;
use crate::{
comparison::personal_best, platform::prelude::*, settings::Image, util::PopulateString,
SegmentHistory, Time, TimeSpan, TimingMethod,
};
#[derive(Clone, Default, Debug, PartialEq)]
pub struct Segment {
name: String,
icon: Image,
best_segment_time: Time,
split_time: Time,
segment_history: SegmentHistory,
comparisons: Comparisons,
variables: HashMap<String, String>,
}
impl Segment {
pub fn new<S>(name: S) -> Self
where
S: Into<String>,
{
Segment {
name: name.into(),
..Default::default()
}
}
#[inline]
pub fn name(&self) -> &str {
&self.name
}
#[inline]
pub fn set_name<S>(&mut self, name: S)
where
S: PopulateString,
{
name.populate(&mut self.name);
}
#[inline]
pub const fn icon(&self) -> &Image {
&self.icon
}
#[inline]
pub fn set_icon<D: Into<Image>>(&mut self, image: D) {
self.icon = image.into();
}
#[inline]
pub fn comparisons_mut(&mut self) -> &mut Comparisons {
&mut self.comparisons
}
#[inline]
pub fn comparison_mut(&mut self, comparison: &str) -> &mut Time {
self.comparisons.get_or_insert_default(comparison)
}
#[inline]
pub fn comparison(&self, comparison: &str) -> Time {
self.comparisons.get(comparison).unwrap_or_default()
}
#[inline]
pub fn comparison_timing_method(
&self,
comparison: &str,
method: TimingMethod,
) -> Option<TimeSpan> {
self.comparisons.get(comparison).and_then(|t| t[method])
}
#[inline]
pub fn personal_best_split_time(&self) -> Time {
self.comparisons
.get(personal_best::NAME)
.unwrap_or_default()
}
#[inline]
pub fn personal_best_split_time_mut(&mut self) -> &mut Time {
self.comparisons.get_or_insert_default(personal_best::NAME)
}
#[inline]
pub fn set_personal_best_split_time(&mut self, time: Time) {
self.comparisons.set(personal_best::NAME, time);
}
#[inline]
pub const fn best_segment_time(&self) -> Time {
self.best_segment_time
}
#[inline]
pub fn best_segment_time_mut(&mut self) -> &mut Time {
&mut self.best_segment_time
}
#[inline]
pub fn set_best_segment_time(&mut self, time: Time) {
self.best_segment_time = time;
}
#[inline]
pub const fn split_time(&self) -> Time {
self.split_time
}
#[inline]
pub fn split_time_mut(&mut self) -> &mut Time {
&mut self.split_time
}
#[inline]
pub fn set_split_time(&mut self, time: Time) {
self.split_time = time;
}
#[inline]
pub fn clear_split_time(&mut self) {
self.set_split_time(Default::default());
}
#[inline]
pub const fn segment_history(&self) -> &SegmentHistory {
&self.segment_history
}
#[inline]
pub fn segment_history_mut(&mut self) -> &mut SegmentHistory {
&mut self.segment_history
}
pub const fn variables(&self) -> &HashMap<String, String> {
&self.variables
}
pub fn variables_mut(&mut self) -> &mut HashMap<String, String> {
&mut self.variables
}
pub fn clear_variables(&mut self) {
self.variables.clear();
}
pub fn clear_split_info(&mut self) {
self.clear_variables();
self.clear_split_time();
}
}