just 1.52.0

🤖 Just a command runner
Documentation
use super::*;

pub(crate) enum Resolution<'src> {
  Disabled(BTreeSet<Modulepath>),
  Resolved(Arc<Recipe<'src>>),
}

impl<'src> Resolution<'src> {
  pub(crate) fn resolve<'a>(
    path: &Namepath<'src>,
    mut modules: &'a Table<'src, Justfile<'src>>,
    mut absent_modules: &'a BTreeSet<String>,
    mut recipes: &'a Table<'src, Arc<Recipe<'src>>>,
    mut disabled_recipes: &'a Table<'src, Disabled<'src>>,
  ) -> Option<Self> {
    let (name, prefix) = path.split_last();

    let mut walked = Vec::new();

    for component in prefix {
      let lexeme = component.lexeme();
      walked.push(lexeme.to_string());

      if let Some(module) = modules.get(lexeme) {
        modules = &module.modules;
        absent_modules = &module.absent_modules;
        recipes = &module.recipes;
        disabled_recipes = &module.disabled_recipes;
      } else if absent_modules.contains(lexeme) {
        return Some(Self::Disabled(BTreeSet::from([Modulepath {
          components: walked,
          spaced: false,
        }])));
      } else {
        return None;
      }
    }

    if let Some(recipe) = recipes.get(name.lexeme()) {
      Some(Self::Resolved(Arc::clone(recipe)))
    } else {
      disabled_recipes
        .get(name.lexeme())
        .map(|disabled| Self::Disabled(disabled.modules.clone()))
    }
  }
}