1use crate::error::{Error, Result};
2use crate::layout::TokenSpan;
3use crate::tile::Tile;
4use serde::{Deserialize, Serialize};
5
6#[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#[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}