diff --git a/Cargo.toml b/Cargo.toml index 32bfee8..099f65f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,12 +31,12 @@ default = ["database-json", "library-beets"] bin = ["structopt"] database-json = ["serde", "serde_json"] library-beets = [] -ssh-library = ["openssh", "tokio"] +library-beets-ssh = ["openssh", "tokio"] tui = ["aho-corasick", "crossterm", "once_cell", "ratatui"] [[bin]] name = "musichoard" -required-features = ["bin", "database-json", "library-beets", "ssh-library", "tui"] +required-features = ["bin", "database-json", "library-beets", "library-beets-ssh", "tui"] [[bin]] name = "musichoard-edit" diff --git a/src/core/database/mod.rs b/src/core/interface/database/mod.rs similarity index 97% rename from src/core/database/mod.rs rename to src/core/interface/database/mod.rs index b3882c1..9ae7435 100644 --- a/src/core/database/mod.rs +++ b/src/core/interface/database/mod.rs @@ -1,10 +1,5 @@ //! Module for storing MusicHoard data in a database. -#[cfg(feature = "database-json")] -pub mod json; -#[cfg(feature = "database-json")] -mod serde; - use std::fmt; #[cfg(test)] diff --git a/src/core/library/mod.rs b/src/core/interface/library/mod.rs similarity index 93% rename from src/core/library/mod.rs rename to src/core/interface/library/mod.rs index 7797c07..448e063 100644 --- a/src/core/library/mod.rs +++ b/src/core/interface/library/mod.rs @@ -1,8 +1,5 @@ //! Module for interacting with the music library. -#[cfg(feature = "library-beets")] -pub mod beets; - use std::{collections::HashSet, fmt, num::ParseIntError, str::Utf8Error}; #[cfg(test)] @@ -59,26 +56,16 @@ pub enum Field { } /// A library query. Can include or exclude particular fields. -#[derive(Debug, PartialEq, Eq)] +#[derive(Debug, Default, PartialEq, Eq)] pub struct Query { - include: HashSet, - exclude: HashSet, -} - -impl Default for Query { - /// Create an empty query. - fn default() -> Self { - Self::new() - } + pub include: HashSet, + pub exclude: HashSet, } impl Query { /// Create an empty query. pub fn new() -> Self { - Query { - include: HashSet::new(), - exclude: HashSet::new(), - } + Query::default() } /// Refine the query to include a particular search term. diff --git a/src/core/library/testmod.rs b/src/core/interface/library/testmod.rs similarity index 99% rename from src/core/library/testmod.rs rename to src/core/interface/library/testmod.rs index 09e56b8..2649422 100644 --- a/src/core/library/testmod.rs +++ b/src/core/interface/library/testmod.rs @@ -2,7 +2,7 @@ use once_cell::sync::Lazy; use crate::core::{ collection::{album::AlbumMonth, track::TrackFormat}, - library::Item, + interface::library::Item, }; pub static LIBRARY_ITEMS: Lazy> = Lazy::new(|| -> Vec { diff --git a/src/core/interface/mod.rs b/src/core/interface/mod.rs new file mode 100644 index 0000000..2b9c4cf --- /dev/null +++ b/src/core/interface/mod.rs @@ -0,0 +1,2 @@ +pub mod database; +pub mod library; diff --git a/src/core/mod.rs b/src/core/mod.rs index 8739da3..8899a5d 100644 --- a/src/core/mod.rs +++ b/src/core/mod.rs @@ -1,6 +1,5 @@ pub mod collection; -pub mod database; -pub mod library; +pub mod interface; pub mod musichoard; #[cfg(test)] diff --git a/src/core/musichoard/mod.rs b/src/core/musichoard/mod.rs index d12bc43..41dc276 100644 --- a/src/core/musichoard/mod.rs +++ b/src/core/musichoard/mod.rs @@ -6,7 +6,10 @@ pub mod musichoard_builder; use std::fmt::{self, Display}; -use crate::core::{collection, database, library}; +use crate::core::{ + collection, + interface::{database, library}, +}; /// Error type for `musichoard`. #[derive(Debug, PartialEq, Eq)] diff --git a/src/core/musichoard/musichoard.rs b/src/core/musichoard/musichoard.rs index 86d2ba8..2eafef3 100644 --- a/src/core/musichoard/musichoard.rs +++ b/src/core/musichoard/musichoard.rs @@ -8,8 +8,10 @@ use crate::core::{ track::{Track, TrackId, TrackNum, TrackQuality}, Collection, MergeCollections, }, - database::IDatabase, - library::{ILibrary, Item, Query}, + interface::{ + database::IDatabase, + library::{ILibrary, Item, Query}, + }, musichoard::Error, }; @@ -468,8 +470,10 @@ mod tests { use crate::core::{ collection::{artist::ArtistId, musicbrainz::MusicBrainz}, - database::{self, MockIDatabase}, - library::{self, testmod::LIBRARY_ITEMS, MockILibrary}, + interface::{ + database::{self, MockIDatabase}, + library::{self, testmod::LIBRARY_ITEMS, MockILibrary}, + }, testmod::{FULL_COLLECTION, LIBRARY_COLLECTION}, }; diff --git a/src/core/musichoard/musichoard_builder.rs b/src/core/musichoard/musichoard_builder.rs index af48922..5b1bc5f 100644 --- a/src/core/musichoard/musichoard_builder.rs +++ b/src/core/musichoard/musichoard_builder.rs @@ -1,7 +1,6 @@ use crate::{ core::{ - database::IDatabase, - library::ILibrary, + interface::{database::IDatabase, library::ILibrary}, musichoard::musichoard::{MusicHoard, NoDatabase, NoLibrary}, }, Error, @@ -79,7 +78,7 @@ impl MusicHoardBuilder { #[cfg(test)] mod tests { - use crate::core::{database::NullDatabase, library::NullLibrary}; + use crate::core::interface::{database::NullDatabase, library::NullLibrary}; use super::*; diff --git a/src/core/database/json/backend.rs b/src/database/json/backend.rs similarity index 94% rename from src/core/database/json/backend.rs rename to src/database/json/backend.rs index 8c99542..07a0a1c 100644 --- a/src/core/database/json/backend.rs +++ b/src/database/json/backend.rs @@ -3,7 +3,7 @@ use std::fs; use std::path::PathBuf; -use crate::core::database::json::IJsonDatabaseBackend; +use crate::database::json::IJsonDatabaseBackend; /// JSON database backend that uses a local file for persistent storage. pub struct JsonDatabaseFileBackend { diff --git a/src/core/database/json/mod.rs b/src/database/json/mod.rs similarity index 98% rename from src/core/database/json/mod.rs rename to src/database/json/mod.rs index 5eec609..80cc6c7 100644 --- a/src/core/database/json/mod.rs +++ b/src/database/json/mod.rs @@ -7,7 +7,7 @@ use mockall::automock; use crate::core::{ collection::Collection, - database::{IDatabase, LoadError, SaveError}, + interface::database::{IDatabase, LoadError, SaveError}, }; use super::serde::{deserialize::DeserializeDatabase, serialize::SerializeDatabase}; diff --git a/src/core/database/json/testmod.rs b/src/database/json/testmod.rs similarity index 100% rename from src/core/database/json/testmod.rs rename to src/database/json/testmod.rs diff --git a/src/database/mod.rs b/src/database/mod.rs new file mode 100644 index 0000000..8bc349c --- /dev/null +++ b/src/database/mod.rs @@ -0,0 +1,4 @@ +#[cfg(feature = "database-json")] +pub mod json; +#[cfg(feature = "database-json")] +mod serde; diff --git a/src/core/database/serde/deserialize.rs b/src/database/serde/deserialize.rs similarity index 98% rename from src/core/database/serde/deserialize.rs rename to src/database/serde/deserialize.rs index 718601e..55bfbe9 100644 --- a/src/core/database/serde/deserialize.rs +++ b/src/database/serde/deserialize.rs @@ -9,7 +9,7 @@ use crate::core::{ musicbrainz::MusicBrainz, Collection, }, - database::LoadError, + interface::database::LoadError, }; #[derive(Debug, Deserialize)] diff --git a/src/core/database/serde/mod.rs b/src/database/serde/mod.rs similarity index 100% rename from src/core/database/serde/mod.rs rename to src/database/serde/mod.rs diff --git a/src/core/database/serde/serialize.rs b/src/database/serde/serialize.rs similarity index 100% rename from src/core/database/serde/serialize.rs rename to src/database/serde/serialize.rs diff --git a/src/lib.rs b/src/lib.rs index 6277808..af8688a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,10 +1,11 @@ //! MusicHoard - a music collection manager. mod core; +pub mod database; +pub mod library; pub use core::collection; -pub use core::database; -pub use core::library; +pub use core::interface; pub use core::musichoard::{ musichoard::{MusicHoard, NoDatabase, NoLibrary}, diff --git a/src/core/library/beets/executor.rs b/src/library/beets/executor.rs similarity index 97% rename from src/core/library/beets/executor.rs rename to src/library/beets/executor.rs index 4a9632e..68e799e 100644 --- a/src/core/library/beets/executor.rs +++ b/src/library/beets/executor.rs @@ -8,7 +8,8 @@ use std::{ str, }; -use crate::core::library::{beets::IBeetsLibraryExecutor, Error}; +use crate::core::interface::library::Error; +use crate::library::beets::IBeetsLibraryExecutor; const BEET_DEFAULT: &str = "beet"; @@ -74,7 +75,7 @@ impl IBeetsLibraryExecutor for BeetsLibraryProcessExecutor { impl IBeetsLibraryExecutorPrivate for BeetsLibraryProcessExecutor {} // GRCOV_EXCL_START -#[cfg(feature = "ssh-library")] +#[cfg(feature = "library-beets-ssh")] pub mod ssh { //! Module for interacting with the music library via //! [beets](https://beets.readthedocs.io/en/stable/) over SSH. diff --git a/src/core/library/beets/mod.rs b/src/library/beets/mod.rs similarity index 98% rename from src/core/library/beets/mod.rs rename to src/library/beets/mod.rs index d67d90d..90c5307 100644 --- a/src/core/library/beets/mod.rs +++ b/src/library/beets/mod.rs @@ -8,7 +8,7 @@ use mockall::automock; use crate::core::{ collection::track::TrackFormat, - library::{Error, Field, ILibrary, Item, Query}, + interface::library::{Error, Field, ILibrary, Item, Query}, }; macro_rules! list_format_separator { @@ -201,7 +201,7 @@ mod testmod; mod tests { use mockall::predicate; - use crate::{collection::album::AlbumMonth, core::library::testmod::LIBRARY_ITEMS}; + use crate::{collection::album::AlbumMonth, core::interface::library::testmod::LIBRARY_ITEMS}; use super::*; use testmod::LIBRARY_BEETS; diff --git a/src/core/library/beets/testmod.rs b/src/library/beets/testmod.rs similarity index 100% rename from src/core/library/beets/testmod.rs rename to src/library/beets/testmod.rs diff --git a/src/library/mod.rs b/src/library/mod.rs new file mode 100644 index 0000000..d0ca87d --- /dev/null +++ b/src/library/mod.rs @@ -0,0 +1,2 @@ +#[cfg(feature = "library-beets")] +pub mod beets; diff --git a/src/main.rs b/src/main.rs index 5c3dfa5..87e3140 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,16 +10,14 @@ use ratatui::{backend::CrosstermBackend, Terminal}; use structopt::StructOpt; use musichoard::{ - database::{ - json::{backend::JsonDatabaseFileBackend, JsonDatabase}, - IDatabase, NullDatabase, + database::json::{backend::JsonDatabaseFileBackend, JsonDatabase}, + interface::{ + database::{IDatabase, NullDatabase}, + library::{ILibrary, NullLibrary}, }, - library::{ - beets::{ - executor::{ssh::BeetsLibrarySshExecutor, BeetsLibraryProcessExecutor}, - BeetsLibrary, - }, - ILibrary, NullLibrary, + library::beets::{ + executor::{ssh::BeetsLibrarySshExecutor, BeetsLibraryProcessExecutor}, + BeetsLibrary, }, MusicHoardBuilder, NoDatabase, NoLibrary, }; diff --git a/src/tui/lib.rs b/src/tui/lib.rs index 990851c..d75ddc8 100644 --- a/src/tui/lib.rs +++ b/src/tui/lib.rs @@ -1,4 +1,7 @@ -use musichoard::{collection::Collection, database::IDatabase, library::ILibrary, MusicHoard}; +use musichoard::{ + collection::Collection, interface::database::IDatabase, interface::library::ILibrary, + MusicHoard, +}; #[cfg(test)] use mockall::automock; diff --git a/tests/database/json.rs b/tests/database/json.rs index f2c6c52..a72657a 100644 --- a/tests/database/json.rs +++ b/tests/database/json.rs @@ -5,10 +5,8 @@ use tempfile::NamedTempFile; use musichoard::{ collection::{album::AlbumDate, artist::Artist, Collection}, - database::{ - json::{backend::JsonDatabaseFileBackend, JsonDatabase}, - IDatabase, - }, + database::json::{backend::JsonDatabaseFileBackend, JsonDatabase}, + interface::database::IDatabase, }; use crate::testlib::COLLECTION; diff --git a/tests/library/beets.rs b/tests/library/beets.rs index 74dcd12..0a7a066 100644 --- a/tests/library/beets.rs +++ b/tests/library/beets.rs @@ -7,9 +7,9 @@ use std::{ use once_cell::sync::Lazy; -use musichoard::library::{ - beets::{executor::BeetsLibraryProcessExecutor, BeetsLibrary}, - Field, ILibrary, Item, Query, +use musichoard::{ + interface::library::{Field, ILibrary, Item, Query}, + library::beets::{executor::BeetsLibraryProcessExecutor, BeetsLibrary}, }; use crate::library::testmod::LIBRARY_ITEMS; diff --git a/tests/library/testmod.rs b/tests/library/testmod.rs index cb85c50..aa6e671 100644 --- a/tests/library/testmod.rs +++ b/tests/library/testmod.rs @@ -2,7 +2,7 @@ use once_cell::sync::Lazy; use musichoard::{ collection::{album::AlbumMonth, track::TrackFormat}, - library::Item, + interface::library::Item, }; pub static LIBRARY_ITEMS: Lazy> = Lazy::new(|| -> Vec {