Separate dependencies (#50)

Closes #39

Reviewed-on: https://git.wojciechkozlowski.eu/wojtek/musichoard/pulls/50
This commit is contained in:
Wojciech Kozlowski 2023-04-27 20:09:45 +02:00
parent ad18c7e384
commit e31b44d31d
6 changed files with 85 additions and 64 deletions

View File

@ -6,16 +6,29 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
crossterm = "0.26.1" crossterm = { version = "0.26.1", optional = true}
openssh = { version = "0.9.9", features = ["native-mux"], default-features = false } openssh = { version = "0.9.9", features = ["native-mux"], default-features = false, optional = true}
ratatui = { version = "0.20.1", optional = true}
serde = { version = "1.0.159", features = ["derive"] } serde = { version = "1.0.159", features = ["derive"] }
serde_json = "1.0.95" serde_json = { version = "1.0.95", optional = true}
structopt = "0.3.26" structopt = { version = "0.3.26", optional = true}
ratatui = "0.20.1" tokio = { version = "1.27.0", features = ["rt"], optional = true}
tokio = { version = "1.27.0", features = ["rt"] }
uuid = { version = "1.3.0", features = ["serde"] } uuid = { version = "1.3.0", features = ["serde"] }
[dev-dependencies] [dev-dependencies]
mockall = "0.11.4" mockall = "0.11.4"
once_cell = "1.17.1" once_cell = "1.17.1"
tempfile = "3.5.0" tempfile = "3.5.0"
[features]
bin = ["structopt"]
database-json = ["serde_json"]
library-ssh = ["openssh", "tokio"]
tui = ["crossterm", "ratatui"]
[[bin]]
name = "musichoard"
required-features = ["bin", "database-json", "library-ssh", "tui"]
[package.metadata.docs.rs]
all-features = true

View File

@ -17,7 +17,7 @@ env CARGO_TARGET_DIR=codecov \
env RUSTFLAGS="-C instrument-coverage" \ env RUSTFLAGS="-C instrument-coverage" \
LLVM_PROFILE_FILE="codecov/debug/profraw/musichoard-%p-%m.profraw" \ LLVM_PROFILE_FILE="codecov/debug/profraw/musichoard-%p-%m.profraw" \
CARGO_TARGET_DIR=codecov \ CARGO_TARGET_DIR=codecov \
cargo test cargo test --all-features
grcov codecov/debug/profraw \ grcov codecov/debug/profraw \
--binary-path ./codecov/debug/ \ --binary-path ./codecov/debug/ \
--output-types html \ --output-types html \

View File

@ -7,6 +7,7 @@ use serde::{de::DeserializeOwned, Serialize};
#[cfg(test)] #[cfg(test)]
use mockall::automock; use mockall::automock;
#[cfg(feature = "database-json")]
pub mod json; pub mod json;
/// Error type for database calls. /// Error type for database calls.

View File

@ -8,9 +8,6 @@ use std::{
str, str,
}; };
use openssh::{KnownHosts, Session};
use tokio::runtime::{self, Runtime};
use super::{BeetsLibraryExecutor, Error}; use super::{BeetsLibraryExecutor, Error};
const BEET_DEFAULT: &str = "beet"; const BEET_DEFAULT: &str = "beet";
@ -77,30 +74,38 @@ impl BeetsLibraryExecutor for BeetsLibraryProcessExecutor {
impl BeetsLibraryExecutorPrivate for BeetsLibraryProcessExecutor {} impl BeetsLibraryExecutorPrivate for BeetsLibraryProcessExecutor {}
// GRCOV_EXCL_START // GRCOV_EXCL_START
/// Beets library executor that executes beets commands over SSH. #[cfg(feature = "library-ssh")]
pub struct BeetsLibrarySshExecutor { pub mod ssh {
use openssh::{KnownHosts, Session};
use tokio::runtime::{self, Runtime};
use super::*;
/// Beets library executor that executes beets commands over SSH.
pub struct BeetsLibrarySshExecutor {
rt: Runtime, rt: Runtime,
session: Session, session: Session,
bin: String, bin: String,
config: Option<String>, config: Option<String>,
} }
impl From<openssh::Error> for Error { impl From<openssh::Error> for Error {
fn from(err: openssh::Error) -> Error { fn from(err: openssh::Error) -> Error {
Error::Executor(err.to_string()) Error::Executor(err.to_string())
} }
} }
impl BeetsLibrarySshExecutor { impl BeetsLibrarySshExecutor {
/// Create a new [`BeetsLibrarySshExecutor`] that uses the default beets executable over an SSH /// Create a new [`BeetsLibrarySshExecutor`] that uses the default beets executable over an
/// connection. This call will attempt to establish the connection and will fail if the /// SSH connection. This call will attempt to establish the connection and will fail if the
/// connection fails. /// connection fails.
pub fn new<H: AsRef<str>>(host: H) -> Result<Self, Error> { pub fn new<H: AsRef<str>>(host: H) -> Result<Self, Error> {
Self::bin(host, BEET_DEFAULT) Self::bin(host, BEET_DEFAULT)
} }
/// Create a new [`BeetsLibrarySshExecutor`] that uses the provided beets executable over an SSH /// Create a new [`BeetsLibrarySshExecutor`] that uses the provided beets executable over an
/// connection. This call will attempt to establish the connection and will fail if the /// SSH connection. This call will attempt to establish the connection and will fail if the
/// connection fails. /// connection fails.
pub fn bin<H: AsRef<str>, S: Into<String>>(host: H, bin: S) -> Result<Self, Error> { pub fn bin<H: AsRef<str>, S: Into<String>>(host: H, bin: S) -> Result<Self, Error> {
let rt = runtime::Builder::new_current_thread() let rt = runtime::Builder::new_current_thread()
@ -121,9 +126,9 @@ impl BeetsLibrarySshExecutor {
self.config = path.map(|p| p.into()); self.config = path.map(|p| p.into());
self self
} }
} }
impl BeetsLibraryExecutor for BeetsLibrarySshExecutor { impl BeetsLibraryExecutor for BeetsLibrarySshExecutor {
fn exec<S: AsRef<str> + 'static>(&mut self, arguments: &[S]) -> Result<Vec<String>, Error> { fn exec<S: AsRef<str> + 'static>(&mut self, arguments: &[S]) -> Result<Vec<String>, Error> {
let mut cmd = self.session.command(&self.bin); let mut cmd = self.session.command(&self.bin);
if let Some(ref path) = self.config { if let Some(ref path) = self.config {
@ -134,7 +139,8 @@ impl BeetsLibraryExecutor for BeetsLibrarySshExecutor {
let output = self.rt.block_on(cmd.output())?; let output = self.rt.block_on(cmd.output())?;
Self::output(output) Self::output(output)
} }
} }
impl BeetsLibraryExecutorPrivate for BeetsLibrarySshExecutor {} impl BeetsLibraryExecutorPrivate for BeetsLibrarySshExecutor {}
}
// GRCOV_EXCL_STOP // GRCOV_EXCL_STOP

View File

@ -12,7 +12,7 @@ use musichoard::{
}, },
library::{ library::{
beets::{ beets::{
executor::{BeetsLibraryProcessExecutor, BeetsLibrarySshExecutor}, executor::{ssh::BeetsLibrarySshExecutor, BeetsLibraryProcessExecutor},
BeetsLibrary, BeetsLibrary,
}, },
Library, Library,

View File

@ -1 +1,2 @@
#[cfg(feature = "database-json")]
mod json; mod json;