use serde::{Deserialize, Serialize};
use crate::statistics::lap_statistics::LapInfo;
use crate::statistics::{KeyStrokeDisplayStringBuilder, SpellDisplayStringBuilder};
use crate::typing_primitive_types::vocabulary::{
corresponding_view_positions_for_spell, ViewPosition,
};
use crate::EntitySummaryStatistics;
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct DisplayInfo {
view: ViewDisplayInfo,
spell: SpellDisplayInfo,
key_stroke: KeyStrokeDisplayInfo,
ideal_key_stroke: IdealKeyStrokeDisplayInfo,
lap_info: LapInfo,
}
impl DisplayInfo {
pub(crate) fn new(
view: ViewDisplayInfo,
spell: SpellDisplayInfo,
key_stroke: KeyStrokeDisplayInfo,
ideal_key_stroke: IdealKeyStrokeDisplayInfo,
lap_info: LapInfo,
) -> Self {
Self {
view,
spell,
key_stroke,
ideal_key_stroke,
lap_info,
}
}
pub fn view_info(&self) -> &ViewDisplayInfo {
&self.view
}
pub fn spell_info(&self) -> &SpellDisplayInfo {
&self.spell
}
pub fn key_stroke_info(&self) -> &KeyStrokeDisplayInfo {
&self.key_stroke
}
pub fn ideal_key_stroke_info(&self) -> &IdealKeyStrokeDisplayInfo {
&self.ideal_key_stroke
}
pub fn lap_info(&self) -> &LapInfo {
&self.lap_info
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct ViewDisplayInfo {
view: String,
current_cursor_positions: Vec<usize>,
wrong_positions: Vec<usize>,
last_position: usize,
}
impl ViewDisplayInfo {
pub(crate) fn new(
spell_display_info: &SpellDisplayInfo,
view: String,
view_position_of_spell: Vec<ViewPosition>,
) -> Self {
Self {
view,
current_cursor_positions: corresponding_view_positions_for_spell(
&spell_display_info.current_cursor_positions,
&view_position_of_spell,
),
wrong_positions: corresponding_view_positions_for_spell(
&spell_display_info.wrong_positions,
&view_position_of_spell,
),
last_position: view_position_of_spell[spell_display_info.last_position].last_position(),
}
}
pub fn view(&self) -> &str {
&self.view
}
pub fn current_cursor_positions(&self) -> &Vec<usize> {
&self.current_cursor_positions
}
pub fn wrong_positions(&self) -> &Vec<usize> {
&self.wrong_positions
}
pub fn last_position(&self) -> usize {
self.last_position
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct SpellDisplayInfo {
spell: String,
current_cursor_positions: Vec<usize>,
wrong_positions: Vec<usize>,
last_position: usize,
summary_statistics: EntitySummaryStatistics,
}
impl SpellDisplayInfo {
pub(crate) fn new(
spell: String,
current_cursor_positions: Vec<usize>,
wrong_positions: Vec<usize>,
last_position: usize,
summary_statistics: EntitySummaryStatistics,
) -> Self {
Self {
spell,
current_cursor_positions,
wrong_positions,
last_position,
summary_statistics,
}
}
pub(crate) fn new_with(
spell_display_string_builder: &SpellDisplayStringBuilder,
summary_statistics: EntitySummaryStatistics,
) -> Self {
Self::new(
spell_display_string_builder.spell().to_string(),
spell_display_string_builder
.cursor_position()
.construct_vec(),
spell_display_string_builder.wrong_positions().to_vec(),
spell_display_string_builder.last_position(),
summary_statistics,
)
}
pub fn spell(&self) -> &str {
&self.spell
}
pub fn current_cursor_positions(&self) -> &Vec<usize> {
&self.current_cursor_positions
}
pub fn wrong_positions(&self) -> &Vec<usize> {
&self.wrong_positions
}
pub fn last_position(&self) -> usize {
self.last_position
}
pub fn summary_statistics(&self) -> &EntitySummaryStatistics {
&self.summary_statistics
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct KeyStrokeDisplayInfo {
key_stroke: String,
current_cursor_position: usize,
wrong_positions: Vec<usize>,
summary_statistics: EntitySummaryStatistics,
}
impl KeyStrokeDisplayInfo {
pub(crate) fn new(
key_stroke: String,
current_cursor_position: usize,
wrong_positions: Vec<usize>,
summary_statistics: EntitySummaryStatistics,
) -> Self {
Self {
key_stroke,
current_cursor_position,
wrong_positions,
summary_statistics,
}
}
pub(crate) fn new_with(
key_stroke_display_string_builder: &KeyStrokeDisplayStringBuilder,
summary_statistics: EntitySummaryStatistics,
) -> Self {
Self::new(
key_stroke_display_string_builder.key_stroke().to_string(),
key_stroke_display_string_builder.cursor_position(),
key_stroke_display_string_builder.wrong_positions().to_vec(),
summary_statistics,
)
}
pub fn key_stroke(&self) -> &str {
&self.key_stroke
}
pub fn current_cursor_position(&self) -> usize {
self.current_cursor_position
}
pub fn wrong_positions(&self) -> &Vec<usize> {
&self.wrong_positions
}
pub fn summary_statistics(&self) -> &EntitySummaryStatistics {
&self.summary_statistics
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct IdealKeyStrokeDisplayInfo {
summary_statistics: EntitySummaryStatistics,
}
impl IdealKeyStrokeDisplayInfo {
pub(crate) fn new(summary_statistics: EntitySummaryStatistics) -> Self {
Self { summary_statistics }
}
pub(crate) fn new_with(summary_statistics: EntitySummaryStatistics) -> Self {
Self::new(summary_statistics)
}
pub fn summary_statistics(&self) -> &EntitySummaryStatistics {
&self.summary_statistics
}
}