Fix searching for libyabridge.so in ~/.local/share

This commit is contained in:
Robbert van der Helm
2020-07-13 14:38:43 +02:00
parent 21d48c3022
commit 5f2cb434bc
+36 -23
View File
@@ -21,10 +21,15 @@ use xdg::BaseDirectories;
/// The name of the config file, relative to `$XDG_CONFIG_HOME/CONFIG_PREFIX`. /// The name of the config file, relative to `$XDG_CONFIG_HOME/CONFIG_PREFIX`.
const CONFIG_FILE_NAME: &str = "config.toml"; const CONFIG_FILE_NAME: &str = "config.toml";
/// The name of the configuration directory, relative to `$XDG_CONFIG_HOME`. /// The name of the XDG base directory prefix for yabridgectl, relative to `$XDG_CONFIG_HOME` and
const CONFIG_PREFIX: &str = "yabridgectl"; /// `$XDG_DATA_HOME`.
const YABRIDGECTL_PREFIX: &str = "yabridgectl";
/// The name of the library file we're searching for.
const LIBYABRIDGE_NAME: &str = "libyabridge.so"; const LIBYABRIDGE_NAME: &str = "libyabridge.so";
/// The name of the XDG base directory prefix for yabridge's own files, relative to
/// `$XDG_CONFIG_HOME` and `$XDG_DATA_HOME`.
const YABRIDGE_PREFIX: &str = "yabridge";
/// The configuration used for yabridgectl. This will be serialized to and deserialized from /// The configuration used for yabridgectl. This will be serialized to and deserialized from
/// `$XDG_CONFIG_HOME/yabridge/config.toml`. /// `$XDG_CONFIG_HOME/yabridge/config.toml`.
@@ -41,11 +46,25 @@ pub struct Config {
pub plugin_dirs: Vec<PathBuf>, pub plugin_dirs: Vec<PathBuf>,
} }
/// Specifies how yabridge will be set up for the found plugins.
#[derive(Deserialize, Serialize, Debug)]
#[serde(rename_all = "snake_case")]
pub enum InstallationMethod {
/// Create a copy of `libyabridge.so` for every Windows VST2 plugin .dll file found. After
/// updating yabridge, the user will have to rerun `yabridgectl sync` to copy over the new
/// version.
Copy,
/// This will create a symlink to `libyabridge.so` for every VST2 .dll file in the plugin
/// directories. As explained in the readme, this makes updating easier and remvoes the need to
/// modify the `PATH` environment variable.
Symlink,
}
impl Config { impl Config {
/// Try to read the config file, creating a new default file if necessary. This will fail if the /// Try to read the config file, creating a new default file if necessary. This will fail if the
/// file could not be created or if it could not be parsed. /// file could not be created or if it could not be parsed.
pub fn read() -> Result<Config, String> { pub fn read() -> Result<Config, String> {
match base_directories()?.find_config_file(CONFIG_FILE_NAME) { match yabridge_directories()?.find_config_file(CONFIG_FILE_NAME) {
Some(path) => { Some(path) => {
let toml_str = fs::read_to_string(&path).map_err(|err| { let toml_str = fs::read_to_string(&path).map_err(|err| {
format!( format!(
@@ -78,7 +97,7 @@ impl Config {
pub fn write(&self) -> Result<(), String> { pub fn write(&self) -> Result<(), String> {
let toml_str = toml::to_string_pretty(&self) let toml_str = toml::to_string_pretty(&self)
.map_err(|err| format!("Could not format TOML: {}", err))?; .map_err(|err| format!("Could not format TOML: {}", err))?;
let config_file = base_directories()? let config_file = yabridgectl_directories()?
.place_config_file(CONFIG_FILE_NAME) .place_config_file(CONFIG_FILE_NAME)
.map_err(|err| format!("Could not write config file: {}", err))?; .map_err(|err| format!("Could not write config file: {}", err))?;
@@ -111,7 +130,7 @@ impl Config {
None => { None => {
// Search in the two common installation locations if no path was set explicitely // Search in the two common installation locations if no path was set explicitely
let system_path = Path::new("/usr/lib"); let system_path = Path::new("/usr/lib");
let user_path = base_directories()?.get_data_home(); let user_path = yabridge_directories()?.get_data_home();
for directory in &[system_path, &user_path] { for directory in &[system_path, &user_path] {
let candidate = directory.join(LIBYABRIDGE_NAME); let candidate = directory.join(LIBYABRIDGE_NAME);
if candidate.exists() { if candidate.exists() {
@@ -131,23 +150,17 @@ impl Config {
} }
} }
/// Specifies how yabridge will be set up for the found plugins. /// Fetch the XDG base directories for yabridge's own files, converting any error messages if this
#[derive(Deserialize, Serialize, Debug)] /// somehow fails into a printable string to reduce boiler plate. This is only used when searching
#[serde(rename_all = "snake_case")] /// for `libyabridge.so` when no explicit search path has been set.
pub enum InstallationMethod { fn yabridge_directories() -> Result<BaseDirectories, String> {
/// Create a copy of `libyabridge.so` for every Windows VST2 plugin .dll file found. After BaseDirectories::with_prefix(YABRIDGE_PREFIX)
/// updating yabridge, the user will have to rerun `yabridgectl sync` to copy over the new .map_err(|err| format!("Error while parsing base directories: {}", err))
/// version. }
Copy,
/// This will create a symlink to `libyabridge.so` for every VST2 .dll file in the plugin /// Fetch the XDG base directories used for yabridgectl, converting any error messages if this
/// directories. As explained in the readme, this makes updating easier and remvoes the need to /// somehow fails into a printable string to reduce boiler plate.
/// modify the `PATH` environment variable. fn yabridgectl_directories() -> Result<BaseDirectories, String> {
Symlink, BaseDirectories::with_prefix(YABRIDGECTL_PREFIX)
}
/// Fetch the XDG base directories, converting any error messages if this somehow fails into a
/// printable string to reduce boiler plate.
fn base_directories() -> Result<BaseDirectories, String> {
BaseDirectories::with_prefix(CONFIG_PREFIX)
.map_err(|err| format!("Error while parsing base directories: {}", err)) .map_err(|err| format!("Error while parsing base directories: {}", err))
} }