# ============================================
# Rule File Parsing
# ============================================

function rule::is_base() {
  local name="${1:-}"
  [[ -f "$(ctx::rules::base)/${name}.rule" ]]
}

function rule::exists() {
  local name="${1:-}"
  [[ -f "$(ctx::rule::path "${name}.rule")" ]] || \
  [[ -f "$(ctx::rules::base)/${name}.rule" ]]
}

function rule::require_assignable() {
  local name="${1:-}"
  if rule::is_base "$name"; then
    log::error "Cannot assign base rule '${name}' — base rules cannot be assigned directly"
    return 1
  fi
}

function rule::require_exists() {
  local name="${1:-}"
  if ! rule::exists "$name"; then
    log::error "Rule not found: ${name}"
    return 1
  fi
}