1mod build;
2mod catalog;
3mod config;
4mod discover;
5mod error;
6mod model;
7mod paths;
8
9pub use build::{BuildItem, BuildOptions, BuildPlan, build_shelf, create_build_plan};
10pub use catalog::{Catalog, CatalogBook, FolderNode, build_catalog, build_folder_tree};
11pub use config::{CONFIG_FILE, load_config, save_config};
12pub use discover::{DetectedBookSource, detect_book_source};
13pub use error::{BookyardError, Result};
14pub use model::{BookConfig, BookEngine, BookyardConfig, BuildConfig, WorkspaceConfig};
15pub use paths::slugify_book_id;
16
17pub fn insert_book(config: &mut BookyardConfig, book: BookConfig) -> Result<()> {
18 if config.books.iter().any(|existing| existing.id == book.id) {
19 return Err(BookyardError::DuplicateBookId(book.id));
20 }
21 config.books.push(book);
22 config
23 .books
24 .sort_by(|a, b| a.order.cmp(&b.order).then_with(|| a.title.cmp(&b.title)));
25 Ok(())
26}