pub mod models;
use std::path::Path;
use crate::result::{Error, Result};
use self::models::{AnnotationRaw, AnnotationsPlist, BookRaw, BooksPlist};
#[derive(Debug, Clone, Copy)]
pub struct ABIos;
impl ABIos {
pub fn extract_books<T>(path: &Path) -> Result<Vec<T>>
where
T: From<BookRaw>,
{
let path = path.join(ABPlist::Books.to_string());
let data: BooksPlist = match plist::from_file(path) {
Ok(data) => data,
Err(error) => {
return Err(Error::UnsupportedIosVersion {
error: error.to_string(),
})
}
};
let books = data.books;
Ok(books.into_iter().map(T::from).collect())
}
#[allow(clippy::missing_panics_doc)]
pub fn extract_annotations<T>(path: &Path) -> Result<Vec<T>>
where
T: From<AnnotationRaw>,
{
let path = path.join(ABPlist::Annotations.to_string());
let data: AnnotationsPlist = match plist::from_file(path) {
Ok(data) => data,
Err(error) => {
return Err(Error::UnsupportedIosVersion {
error: error.to_string(),
})
}
};
let mut annotations = data.into_values().next().unwrap().bookmarks;
annotations.retain(|annotation| annotation.is_deleted == 0);
Ok(annotations.into_iter().map(T::from).collect())
}
}
#[derive(Debug, Clone, Copy)]
pub enum ABPlist {
Books,
Annotations,
}
impl std::fmt::Display for ABPlist {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ABPlist::Books => write!(f, "Books.plist"),
ABPlist::Annotations => write!(f, "com.apple.ibooks-sync.plist"),
}
}
}