//! Quirks module for handling package-specific workarounds //! //! This module provides functionality to read quirks from a YAML file //! and apply them during pull and deb operations. use lazy_static::lazy_static; use serde::{Deserialize, Serialize}; use std::collections::HashMap; /// Quirks configuration for a specific operation (pull or deb) #[derive(Debug, Clone, Deserialize, Serialize)] pub struct OperationQuirks { /// Extra dependencies to install before the operation #[serde(default)] pub extra_dependencies: Vec, /// Additional parameters for the operation #[serde(default)] pub parameters: HashMap, /// Custom package directories to try when looking for the package source /// This is useful for packages that don't follow the standard naming conventions /// like linux packages that use directories like "linux-main" or other custom names #[serde(default)] pub package_directory: Vec, } /// Quirks for a specific package #[derive(Debug, Clone, Deserialize, Serialize)] pub struct PackageQuirks { /// Quirks to apply during pull operation #[serde(default)] pub pull: Option, /// Quirks to apply during deb operation #[serde(default)] pub deb: Option, } /// Top-level quirks configuration #[derive(Debug, Clone, Deserialize, Serialize)] pub struct QuirksConfig { /// Map of package names to their quirks pub quirks: HashMap, } const QUIRKS_YAML: &str = include_str!("../quirks.yml"); lazy_static! { static ref QUIRKS_DATA: QuirksConfig = serde_yaml::from_str(QUIRKS_YAML).unwrap(); } /// Get quirks for a specific package /// /// # Arguments /// * `config` - The quirks configuration /// * `package` - The package name /// /// # Returns /// * `Option` - The quirks for the package, or None if not found pub fn get_package_quirks<'a>( config: &'a QuirksConfig, package: &str, ) -> Option<&'a PackageQuirks> { config.quirks.get(package) } /// Get deb-time extra dependencies for a package /// /// This function returns the list of extra dependencies that should be installed /// before building a package, as defined in the quirks configuration. /// /// # Arguments /// * `package` - The package name /// /// # Returns /// * `Vec` - List of extra dependencies, or empty vector if none pub fn get_deb_extra_dependencies(package: &str) -> Vec { if let Some(quirks) = &get_package_quirks(&QUIRKS_DATA, package).unwrap().deb { return quirks.extra_dependencies.clone(); } Vec::new() } /// Get package directories from quirks configuration /// /// This function returns the list of custom package directories to try /// when looking for the package source directory. /// /// # Arguments /// * `package` - The package name /// /// # Returns /// * `Vec` - List of package directories to try, or empty vector if none pub fn get_package_directories(package: &str) -> Vec { if let Some(quirks) = get_package_quirks(&QUIRKS_DATA, package) { // Check deb quirks first, then pull quirks if let Some(deb_quirks) = &quirks.deb && !deb_quirks.package_directory.is_empty() { return deb_quirks.package_directory.clone(); } if let Some(pull_quirks) = &quirks.pull && !pull_quirks.package_directory.is_empty() { return pull_quirks.package_directory.clone(); } } Vec::new() }