darklua 0.18.0

Transform Lua scripts
Documentation
use std::path::Path;

use serde::{de, Deserialize, Deserializer, Serialize};
use wax::{Glob, Pattern};

use crate::DarkluaError;

#[derive(Debug, Clone, Serialize)]
#[serde(into = "String")]
pub(crate) struct FilterPattern {
    original: String,
    glob: Glob<'static>,
}

impl PartialEq for FilterPattern {
    fn eq(&self, other: &Self) -> bool {
        self.original == other.original
    }
}

impl Eq for FilterPattern {}

impl FilterPattern {
    pub(crate) fn new(pattern: String) -> Result<Self, DarkluaError> {
        let glob = Glob::new(&pattern)
            .map(Glob::into_owned)
            .map_err(|err| DarkluaError::invalid_glob_pattern(&pattern, err.to_string()))?;
        Ok(Self {
            original: pattern,
            glob,
        })
    }

    pub(crate) fn matches(&self, path: &Path) -> bool {
        self.glob.is_match(path)
    }

    pub(crate) fn original(&self) -> &str {
        &self.original
    }
}

impl<'de> Deserialize<'de> for FilterPattern {
    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
        let value = String::deserialize(deserializer)?;
        Self::new(value).map_err(de::Error::custom)
    }
}

impl From<FilterPattern> for String {
    fn from(filter: FilterPattern) -> String {
        filter.original
    }
}