use crate::{error::PdfResult, objects::Dictionary, Resolve};
use super::state::StateModel;
#[derive(Debug)]
pub(crate) struct TextAnnotation {
is_open: bool,
name: TextAnnotationName,
state: Option<StateModel>,
}
#[derive(Debug)]
enum TextAnnotationName {
Comment,
Key,
Note,
Help,
NewParagraph,
Paragraph,
Insert,
Other(String),
}
impl TextAnnotationName {
pub fn from_str(s: String) -> Self {
match s.as_ref() {
"Comment" => Self::Comment,
"Key" => Self::Key,
"Note" => Self::Note,
"Help" => Self::Help,
"NewParagraph" => Self::NewParagraph,
"Paragraph" => Self::Paragraph,
"Insert" => Self::Insert,
_ => Self::Other(s),
}
}
}
impl Default for TextAnnotationName {
fn default() -> Self {
Self::Note
}
}
impl TextAnnotation {
const TYPE: &'static str = "Text";
pub fn from_dict(dict: &mut Dictionary, resolver: &mut dyn Resolve) -> PdfResult<Self> {
let is_open = dict.get_bool("Open", resolver)?.unwrap_or(false);
let name = dict
.get_name("Name", resolver)?
.map(TextAnnotationName::from_str)
.unwrap_or_default();
let state = if let Some(state) = dict.get_string("State", resolver)? {
let state_model = dict.expect_string("StateModel", resolver)?;
Some(StateModel::with_state(&state_model, &state)?)
} else if let Some(state_model) = dict.get_string("StateModel", resolver)? {
Some(StateModel::default(&state_model)?)
} else {
None
};
Ok(Self {
is_open,
name,
state,
})
}
}