termrs_core 0.3.0

The core library of termrs
Documentation
use super::Position;

#[derive(Clone, Copy, Default, Debug, PartialEq, Eq, Hash)]
pub struct Offset {
    pub x: u16,
    pub y: u16,
}

impl Offset {
    pub const ZERO: Offset = Offset { x: 0, y: 0 };

    pub fn new(x: u16, y: u16) -> Self {
        Self { x, y }
    }

    pub fn add_position(&self, position: Position) -> Position {
        Position {
            column: position.column + self.x,
            row: position.row + self.y,
        }
    }

    pub fn sub_position(&self, position: Position) -> Position {
        Position {
            column: position.column - self.x,
            row: position.row - self.y,
        }
    }

    pub fn try_add_position(&self, position: Position) -> Option<Position> {
        let x = position.column.checked_add(self.x)?;
        let y = position.row.checked_add(self.y)?;

        Some(Position::new(x, y))
    }

    pub fn try_sub_position(&self, position: Position) -> Option<Position> {
        let x = position.column.checked_sub(self.x)?;
        let y = position.row.checked_sub(self.y)?;

        Some(Position::new(x, y))
    }
}