use crate::{
parser::{parse_subset, Parser},
tokenizer::{Token, Tokenizer},
types::{
address::Address, custom::UserDefinedTag, date::change_date::ChangeDate,
multimedia::link::Link, note::Note, Xref,
},
};
#[cfg(feature = "json")]
use serde::{Deserialize, Serialize};
#[derive(Debug, Default)]
#[cfg_attr(feature = "json", derive(Serialize, Deserialize))]
pub struct Submitter {
pub xref: Option<Xref>,
pub name: Option<String>,
pub address: Option<Address>,
pub multimedia: Vec<Link>,
pub language: Option<String>,
pub registered_refn: Option<String>,
pub automated_record_id: Option<String>,
pub change_date: Option<ChangeDate>,
pub note: Option<Note>,
pub phone: Option<String>,
pub custom_data: Vec<Box<UserDefinedTag>>,
}
impl Submitter {
#[must_use]
fn with_xref(xref: Option<Xref>) -> Self {
Self {
xref,
..Default::default()
}
}
#[must_use]
pub fn new(tokenizer: &mut Tokenizer, level: u8, xref: Option<Xref>) -> Submitter {
let mut subm = Submitter::with_xref(xref);
subm.parse(tokenizer, level);
subm
}
pub fn add_multimedia(&mut self, multimedia: Link) {
self.multimedia.push(multimedia);
}
}
impl Parser for Submitter {
fn parse(&mut self, tokenizer: &mut Tokenizer, level: u8) {
tokenizer.next_token();
let handle_subset = |tag: &str, tokenizer: &mut Tokenizer| {
let mut pointer: Option<String> = None;
if let Token::Pointer(xref) = &tokenizer.current_token {
pointer = Some(xref.to_string());
tokenizer.next_token();
}
match tag {
"NAME" => self.name = Some(tokenizer.take_line_value()),
"ADDR" => self.address = Some(Address::new(tokenizer, level + 1)),
"OBJE" => self.add_multimedia(Link::new(tokenizer, level + 1, pointer)),
"LANG" => self.language = Some(tokenizer.take_line_value()),
"NOTE" => self.note = Some(Note::new(tokenizer, level + 1)),
"CHAN" => self.change_date = Some(ChangeDate::new(tokenizer, level + 1)),
"PHON" => self.phone = Some(tokenizer.take_line_value()),
_ => panic!("{} Unhandled Submitter Tag: {}", tokenizer.debug(), tag),
}
};
self.custom_data = parse_subset(tokenizer, level, handle_subset);
}
}