mod iterator;
use crate::{
message::CatalogMessageMutView, message::Message, message::MessageKey, message::MessageView,
metadata::CatalogMetadata,
};
pub use iterator::{Iter, IterMut, MessageMutProxy};
use std::collections::btree_map::BTreeMap;
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Catalog {
pub preheader: Vec<String>,
pub metadata: CatalogMetadata,
pub(crate) messages: Vec<Option<Message>>,
pub(crate) map: BTreeMap<MessageKey, usize>,
}
impl Catalog {
pub(crate) fn empty() -> Self {
Self {
preheader: vec![],
metadata: CatalogMetadata::default(),
messages: vec![],
map: BTreeMap::new(),
}
}
pub fn new(metadata: CatalogMetadata) -> Self {
Self {
metadata,
..Self::empty()
}
}
pub fn count(&self) -> usize {
self.messages().count()
}
pub fn is_empty(&self) -> bool {
self.count() == 0
}
pub fn messages(&self) -> Iter<'_> {
Iter::begin(self)
}
pub fn messages_mut(&mut self) -> IterMut<'_> {
IterMut::begin(self)
}
pub fn find_message(
&self,
msgctxt: Option<&str>,
msgid: &str,
msgid_plural: Option<&str>,
) -> Option<&dyn MessageView> {
let key = MessageKey::gen(msgctxt, msgid, msgid_plural);
if let Some(&index) = self.map.get(&key) {
Some(self.messages[index].as_ref().unwrap())
} else {
None
}
}
pub fn find_message_mut(
&mut self,
msgctxt: Option<&str>,
msgid: &str,
msgid_plural: Option<&str>,
) -> Option<MessageMutProxy<'_>> {
let key = MessageKey::gen(msgctxt, msgid, msgid_plural);
if let Some(&index) = self.map.get(&key) {
Some(MessageMutProxy::at(self, index))
} else {
None
}
}
pub fn delete_message(
&mut self,
msgctxt: Option<&str>,
msgid: &str,
msgid_plural: Option<&str>,
) -> bool {
if let Some(mut m) = self.find_message_mut(msgctxt, msgid, msgid_plural) {
m.delete();
true
} else {
false
}
}
pub fn detach_message(
&mut self,
msgctxt: Option<&str>,
msgid: &str,
msgid_plural: Option<&str>,
) -> Option<Message> {
self.find_message_mut(msgctxt, msgid, msgid_plural)
.map(|mut m| m.detach())
}
pub fn append_or_update(&mut self, m: Message) {
let key = MessageKey::from(&m);
if let Some(&index) = self.map.get(&key) {
self.messages[index] = Some(m);
} else {
let index = self.messages.len();
self.messages.push(Some(m));
self.map.insert(key, index);
}
}
}