selene-core 0.3.1

selene-core is the backend for Selene, a local-first music player
Documentation
use std::{io, path::PathBuf};

use crate::config::common::CommonConfig;

impl CommonConfig {
    pub(crate) fn valid_library_dir(
        &self,
        directory: impl Into<PathBuf>,
    ) -> Result<bool, io::Error> {
        let directory = directory.into();
        let cannonical_library = {
            if directory.exists() {
                directory.canonicalize()?
            } else {
                directory
            }
        };

        if cannonical_library.is_relative() {
            return Ok(false);
        }

        if cannonical_library.exists() && !cannonical_library.is_dir() {
            return Ok(false);
        }

        let sources: Vec<PathBuf> = self
            .source_dirs
            .iter()
            .map(|s| {
                if s.exists() {
                    s.canonicalize()
                } else {
                    Ok(s.clone())
                }
            })
            .collect::<Result<Vec<PathBuf>, io::Error>>()?;

        let valid = !sources.iter().any(|source| {
            source.starts_with(&cannonical_library) || cannonical_library.starts_with(source)
        });

        Ok(valid)
    }

    pub(crate) fn valid_source_dir(
        &self,
        directory: impl Into<PathBuf>,
    ) -> Result<bool, io::Error> {
        let directory = directory.into();
        let canonical_source = {
            if directory.exists() {
                directory.canonicalize()?
            } else {
                directory
            }
        };

        if canonical_source.is_relative() {
            return Ok(false);
        }

        if canonical_source.exists() && !canonical_source.is_dir() {
            return Ok(false);
        }

        let valid = if let Some(library_dir) = self.library_dir.as_ref() {
            let canonical_library = library_dir.canonicalize()?;

            !canonical_library.starts_with(&canonical_source)
                && !canonical_source.starts_with(canonical_library)
        } else {
            true
        };

        Ok(valid)
    }
}