id = $config['id'] ?? Str::uuid()->toString(); $this->value = $config['value']; $this->model = $config['model']; $this->operator = $config['operator']; } public static function assertConfig(array $config, bool $allowUserIdModel = true): void { if ($config['id'] ?? null) { Assert::uuid($config['id']); } Assert::oneOf($config['operator'], self::VALID_OPERATORS); Assert::oneOf( $config['model'], $allowUserIdModel ? array_prepend(self::VALID_MODELS, self::MODEL_USER_ID) : self::VALID_MODELS ); Assert::isArray($config['value']); Assert::countBetween($config['value'], 1, 2); } public static function make(array $config): self { return new self($config); } /** @return array */ public function toArray(): array { return [ 'id' => $this->id, 'model' => $this->model, 'operator' => $this->operator, 'value' => $this->value, ]; } public function equals(array|self $rule): bool { if (is_array($rule)) { $rule = self::make($rule); } return $this->operator === $rule->operator && !array_diff($this->value, $rule->value) && $this->model === $rule->model; } }