use crate::line::LineId;
use crate::segment::SegmentId;
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub enum Position {
Absolute(AbsolutePosition),
Relative(RelativePosition),
}
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub struct AbsolutePosition {
column: u16,
row: u16,
}
impl AbsolutePosition {
pub fn new(column: u16, row: u16) -> Self {
Self { column, row }
}
pub fn new_from_tuple(tuple: (u16, u16)) -> Self {
Self::new(tuple.0, tuple.1)
}
pub fn column(&self) -> u16 {
self.column
}
pub fn row(&self) -> u16 {
self.row
}
pub fn set_column(&self, column: u16) -> AbsolutePosition {
AbsolutePosition {
column,
row: self.row,
}
}
pub fn set_row(&self, row: u16) -> AbsolutePosition {
AbsolutePosition {
column: self.column,
row,
}
}
pub fn add_columns(&self, diff_columns: i16) -> AbsolutePosition {
AbsolutePosition {
column: (self.column as i16 + diff_columns) as u16,
row: self.row,
}
}
pub fn add_rows(&self, diff_rows: i16) -> AbsolutePosition {
AbsolutePosition {
column: self.column,
row: (self.row as i16 + diff_rows) as u16,
}
}
}
impl Default for AbsolutePosition {
fn default() -> AbsolutePosition {
AbsolutePosition::new(0, 0)
}
}
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub struct RelativePosition {
line_id: LineId,
segment_id: SegmentId,
position: u16,
}
impl RelativePosition {
pub fn new(line_id: LineId, segment_id: SegmentId, position: u16) -> Self {
Self {
line_id,
segment_id,
position,
}
}
pub fn line_id(&self) -> LineId {
self.line_id
}
pub fn segment_id(&self) -> SegmentId {
self.segment_id
}
pub fn position(&self) -> u16 {
self.position
}
}