use crate::metadata::Metadata;
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, Serialize, PartialEq)]
pub enum ElementType {
Formula,
FigureCaption,
NarrativeText,
ListItem,
Title,
Address,
EmailAddress,
Image,
PageBreak,
Table,
Header,
Footer,
CodeSnippet,
PageNumber,
UncategorizedText,
CompositeElement,
}
#[derive(Debug, Deserialize, Serialize, PartialEq)]
pub struct Element {
pub r#type: ElementType,
pub element_id: String,
pub text: String,
pub metadata: Option<Metadata>,
}
pub type ElementList = Vec<Element>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_deserialize_simple() {
let json_str = r#"
{
"type": "NarrativeText",
"element_id": "1",
"text": "Hello, world!",
"metadata": null
}
"#;
let expected = Element {
r#type: ElementType::NarrativeText,
element_id: "1".to_string(),
text: "Hello, world!".to_string(),
metadata: None,
};
let element: Element = serde_json::from_str(json_str).unwrap();
assert_eq!(element, expected);
}
#[test]
fn test_deserialize_with_metadata() {
let json_str = r#"
{
"type": "Image",
"element_id": "2",
"text": "An image element"
}
"#;
let expected = Element {
r#type: ElementType::Image,
element_id: "2".to_string(),
text: "An image element".to_string(),
metadata: None,
};
let element: Element = serde_json::from_str(json_str).unwrap();
assert_eq!(element, expected);
}
#[test]
fn test_deserialize_without_metadata() {
let json_str = r#"
{
"type": "ListItem",
"element_id": "3",
"text": "A list element."
}
"#;
let expected = Element {
r#type: ElementType::ListItem,
element_id: "3".to_string(),
text: "A list element.".to_string(),
metadata: None,
};
let element: Element = serde_json::from_str(json_str).unwrap();
assert_eq!(element, expected);
}
#[test]
fn test_serialize() {
let element = Element {
r#type: ElementType::NarrativeText,
element_id: "1".to_string(),
text: "Hello, world!".to_string(),
metadata: None,
};
let expected_json =
r#"{"type":"NarrativeText","element_id":"1","text":"Hello, world!","metadata":null}"#;
let json_str = serde_json::to_string(&element).unwrap();
assert_eq!(json_str, expected_json);
}
}