use std::collections::HashMap;
use kstring::KString;
use smallvec::SmallVec;
use crate::{Assignment, AssignmentRef};
mod attributes;
mod outcome;
mod refmap;
pub(crate) use refmap::RefMap;
pub type Assignments = SmallVec<[TrackedAssignment; AVERAGE_NUM_ATTRS]>;
#[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone)]
pub enum Value {
MacroAssignments {
id: AttributeId,
assignments: Assignments,
},
Assignments(Assignments),
}
#[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone)]
pub struct TrackedAssignment {
pub id: AttributeId,
pub inner: Assignment,
}
#[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone, Default)]
pub struct Attributes;
#[derive(Clone, PartialEq, Eq, Debug, Hash, Ord, PartialOrd)]
pub struct Match<'a> {
pub pattern: &'a gix_glob::Pattern,
pub assignment: AssignmentRef<'a>,
pub kind: MatchKind,
pub location: MatchLocation<'a>,
}
#[derive(Clone, PartialEq, Eq, Debug, Hash, Ord, PartialOrd)]
pub struct MatchLocation<'a> {
pub source: Option<&'a std::path::Path>,
pub sequence_number: usize,
}
#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash, Ord, PartialOrd)]
pub enum MatchKind {
Attribute {
macro_id: Option<AttributeId>,
},
Macro {
parent_macro_id: Option<AttributeId>,
},
}
#[derive(Default, Clone)]
pub struct Outcome {
matches_by_id: Vec<Slot>,
attrs_stack: SmallVec<[(AttributeId, Assignment, Option<AttributeId>); 8]>,
selected: SmallVec<[(KString, Option<AttributeId>); AVERAGE_NUM_ATTRS]>,
patterns: RefMap<gix_glob::Pattern>,
assignments: RefMap<Assignment>,
source_paths: RefMap<std::path::PathBuf>,
remaining: Option<usize>,
}
#[derive(Default, Clone)]
struct Slot {
r#match: Option<outcome::Match>,
macro_attributes: Assignments,
}
#[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone, Copy)]
pub struct AttributeId(pub usize);
impl Default for AttributeId {
fn default() -> Self {
AttributeId(usize::MAX)
}
}
#[derive(Clone, Debug, Default)]
pub struct MetadataCollection {
name_to_meta: HashMap<KString, Metadata>,
}
#[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone)]
pub struct Metadata {
pub id: AttributeId,
pub macro_attributes: Assignments,
}
const AVERAGE_NUM_ATTRS: usize = 3;