use easyofd_core::ST_Box;
#[derive(Debug, Clone)]
pub struct KeywordPosition {
pub page: usize,
pub rect: ST_Box,
pub keyword: Option<String>,
}
impl KeywordPosition {
#[must_use]
pub fn new(page: usize, rect: ST_Box) -> Self {
Self {
page,
rect,
keyword: None,
}
}
#[must_use]
pub fn with_keyword(mut self, keyword: impl Into<String>) -> Self {
self.keyword = Some(keyword.into());
self
}
#[must_use]
pub fn x(&self) -> f64 {
self.rect.top_left_x
}
#[must_use]
pub fn y(&self) -> f64 {
self.rect.top_left_y
}
#[must_use]
pub fn width(&self) -> f64 {
self.rect.width
}
#[must_use]
pub fn height(&self) -> f64 {
self.rect.height
}
}
impl std::fmt::Display for KeywordPosition {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"KeywordPosition{{page={}, rect=({}, {}, {}, {}), keyword={}}}",
self.page,
self.rect.top_left_x,
self.rect.top_left_y,
self.rect.width,
self.rect.height,
self.keyword.as_deref().unwrap_or("")
)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_keyword_position_new() {
let rect = ST_Box::new(10.0, 20.0, 50.0, 12.0);
let pos = KeywordPosition::new(1, rect);
assert_eq!(pos.page, 1);
assert!((pos.x() - 10.0).abs() < f64::EPSILON);
assert!((pos.y() - 20.0).abs() < f64::EPSILON);
assert!((pos.width() - 50.0).abs() < f64::EPSILON);
assert!((pos.height() - 12.0).abs() < f64::EPSILON);
assert!(pos.keyword.is_none());
}
#[test]
fn test_keyword_position_with_keyword() {
let rect = ST_Box::new(0.0, 0.0, 100.0, 20.0);
let pos = KeywordPosition::new(3, rect).with_keyword("OFD");
assert_eq!(pos.keyword.as_deref(), Some("OFD"));
}
#[test]
fn test_keyword_position_display() {
let rect = ST_Box::new(10.0, 20.0, 50.0, 12.0);
let pos = KeywordPosition::new(1, rect).with_keyword("test");
let s = format!("{pos}");
assert!(s.contains("page=1"));
assert!(s.contains("test"));
}
}