use std::path::PathBuf;
use schemars::JsonSchema;
use serde::Deserialize;
use serde::Serialize;
use mago_database::GlobSettings;
use crate::config::CURRENT_DIR;
use crate::consts::PHP_EXTENSION;
use crate::error::Error;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(default, rename_all = "kebab-case", deny_unknown_fields)]
pub struct SourceConfiguration {
pub workspace: PathBuf,
#[serde(default)]
pub paths: Vec<String>,
#[serde(default)]
pub includes: Vec<String>,
#[serde(default)]
pub excludes: Vec<String>,
#[serde(default = "default_extensions")]
pub extensions: Vec<String>,
#[serde(default)]
pub glob: GlobConfiguration,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(default, rename_all = "kebab-case", deny_unknown_fields)]
pub struct GlobConfiguration {
pub case_insensitive: bool,
pub literal_separator: bool,
pub backslash_escape: bool,
pub empty_alternates: bool,
}
impl Default for GlobConfiguration {
fn default() -> Self {
Self { case_insensitive: false, literal_separator: false, backslash_escape: true, empty_alternates: false }
}
}
impl GlobConfiguration {
pub fn to_database_settings(&self) -> GlobSettings {
GlobSettings {
case_insensitive: self.case_insensitive,
literal_separator: self.literal_separator,
backslash_escape: self.backslash_escape,
empty_alternates: self.empty_alternates,
}
}
}
impl Default for SourceConfiguration {
fn default() -> Self {
Self::from_workspace(CURRENT_DIR.clone())
}
}
impl SourceConfiguration {
pub fn from_workspace(workspace: PathBuf) -> Self {
Self {
workspace,
paths: vec![],
includes: vec![],
excludes: vec![],
extensions: vec![PHP_EXTENSION.to_string()],
glob: GlobConfiguration::default(),
}
}
}
impl SourceConfiguration {
pub fn normalize(&mut self) -> Result<(), Error> {
let workspace =
if !self.workspace.is_absolute() { (*CURRENT_DIR).join(&self.workspace) } else { self.workspace.clone() };
self.workspace = workspace.canonicalize().map_err(|e| Error::CanonicalizingPath(workspace, e))?;
Ok(())
}
}
fn default_extensions() -> Vec<String> {
vec![PHP_EXTENSION.to_string()]
}