function cmd::identity::_rule_assign() { local name="" rule="" while [[ $# -gt 0 ]]; do case "$1" in --name) name="$2"; shift 2 ;; --rule) rule="$2"; shift 2 ;; *) log::error "Unknown flag: $1"; return 1 ;; esac done [[ -z "$name" ]] && { log::error "Missing required flag: --name"; return 1; } [[ -z "$rule" ]] && { log::error "Missing required flag: --rule"; return 1; } identity::require_exists "$name" || return 1 rule::exists "$rule" || { log::error "Rule not found: ${rule}"; return 1; } local exit_code identity::add_rule "$name" "$rule" exit_code=$? if [[ $exit_code -eq 2 ]]; then log::warn "Rule '${rule}' is already assigned to identity '${name}'" return 0 fi log::ok "Rule '${rule}' assigned to identity '${name}'" # Reapply rules if auto_apply local auto auto=$(identity::rule_flags "$name" "auto_apply") if [[ "$auto" != "false" ]]; then log::info "Reapplying rules for all peers in identity '${name}'..." identity::reapply_rules "$name" log::ok "Rules reapplied" fi # Warn about strict_rule if policy::strict_rule "$(identity::policy "$name")"; then log::warn "Strict rule is enabled for identity '${name}' — peer rules will not be additive" fi }