use std::fs::File;
use std::io::{BufWriter, Seek, Write};
use std::num::NonZeroU32;
use std::path::Path;
use crate::persistence::PersistenceError;
use crate::{persistence, BlockCompression, MetadataEntry, Page};
pub struct BookBuilder {
next_page_id: NonZeroU32,
metadata: Vec<MetadataEntry>,
pages: Vec<Page>,
compression: BlockCompression,
}
impl BookBuilder {
pub(crate) fn new() -> BookBuilder {
BookBuilder {
next_page_id: NonZeroU32::new(1).unwrap(),
metadata: Vec::new(),
pages: Vec::new(),
compression: Default::default(),
}
}
pub fn set_compression(&mut self, compression: BlockCompression) -> &mut BookBuilder {
self.compression = compression;
self
}
pub fn add_metadata(&mut self, entry: MetadataEntry) -> &mut BookBuilder {
self.metadata.push(entry);
self
}
pub fn new_page(&mut self, title: impl Into<String>) -> &mut Page {
let page = Page::new(title.into(), self.next_page_id);
self.next_page_id = self.next_page_id.saturating_add(1);
self.pages.push(page);
self.pages.last_mut().unwrap()
}
pub fn dump<O>(&self, output: O) -> Result<(), PersistenceError>
where
O: Write + Seek,
{
persistence::dump(output, &self.pages, &self.metadata, self.compression)
}
pub fn dump_to_file(&self, path: impl AsRef<Path>) -> Result<(), PersistenceError> {
self.dump(BufWriter::new(File::create(path)?))
}
}