mars-agents 0.4.8-rc.5

Agent package manager for .agents/ directories
Documentation
use std::collections::HashMap;

use indexmap::IndexMap;

use crate::config::FilterMode;
use crate::lock::ItemKind;
use crate::types::{ItemName, SourceName};

use super::package::RegisteredPackage;

pub(crate) fn is_item_excluded(
    filter_constraints: &HashMap<SourceName, Vec<FilterMode>>,
    registry: &IndexMap<SourceName, RegisteredPackage>,
    package: &SourceName,
    kind: ItemKind,
    item: &ItemName,
) -> bool {
    let source_path = registry
        .get(package)
        .and_then(|pkg| pkg.item(kind, item))
        .map(|discovered| discovered.source_path.to_string_lossy().into_owned());

    filter_constraints
        .get(package)
        .map(|filters| {
            filters.iter().any(|filter| match filter {
                FilterMode::Exclude(excluded) => excluded.iter().any(|excluded_item| {
                    excluded_item == item
                        || source_path.as_deref().is_some_and(|path| {
                            crate::target::paths_equivalent(excluded_item.as_ref(), path)
                        })
                }),
                _ => false,
            })
        })
        .unwrap_or(false)
}

pub(crate) fn push_filter_constraint(
    constraints: &mut HashMap<SourceName, Vec<FilterMode>>,
    source_name: &SourceName,
    filter: &FilterMode,
) {
    let entry = constraints.entry(source_name.clone()).or_default();
    if !entry.contains(filter) {
        entry.push(filter.clone());
    }
}

pub(crate) fn is_unfiltered_request(filter: &FilterMode) -> bool {
    matches!(filter, FilterMode::All)
}