Skip to main content

multiscreen_rs/
screen.rs

1use crate::error::{Error, Result};
2use crate::layout::TokenSpan;
3use crate::tile::Tile;
4use serde::{Deserialize, Serialize};
5
6/// Controls how a token sequence is split into screens.
7#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
8pub struct ScreenConfig {
9    #[serde(alias = "screen_size")]
10    pub tokens_per_screen: usize,
11    #[serde(alias = "screen_stride")]
12    pub screen_stride_tokens: usize,
13    #[serde(alias = "max_screens", alias = "max_screen_layout_count")]
14    pub max_screen_count: Option<usize>,
15}
16
17impl Default for ScreenConfig {
18    fn default() -> Self {
19        Self {
20            tokens_per_screen: 128,
21            screen_stride_tokens: 64,
22            max_screen_count: None,
23        }
24    }
25}
26
27impl ScreenConfig {
28    pub fn validate(&self) -> Result<()> {
29        if self.tokens_per_screen == 0 {
30            return Err(Error::Config(
31                "tokens_per_screen must be greater than zero".into(),
32            ));
33        }
34        if self.screen_stride_tokens == 0 {
35            return Err(Error::Config(
36                "screen_stride_tokens must be greater than zero".into(),
37            ));
38        }
39        if matches!(self.max_screen_count, Some(0)) {
40            return Err(Error::Config(
41                "max_screen_count must be omitted or greater than zero".into(),
42            ));
43        }
44        Ok(())
45    }
46}
47
48/// A screen over a contiguous token span.
49#[derive(Clone, Debug, PartialEq, Eq)]
50pub struct Screen {
51    pub index: usize,
52    pub span: TokenSpan,
53    pub tiles: Vec<Tile>,
54}
55
56impl Screen {
57    pub fn new(index: usize, span: TokenSpan, tiles: Vec<Tile>) -> Self {
58        Self { index, span, tiles }
59    }
60
61    pub fn len(&self) -> usize {
62        self.span.len()
63    }
64
65    pub fn is_empty(&self) -> bool {
66        self.span.is_empty()
67    }
68}