addQualifiers(...$qualifiers); } /** * Adds the qualifier to the action. * * @param BaseComponent|null $qualifier The qualifier to add. * * @return $this */ public function addQualifier(BaseComponent $qualifier = null) { ArrayUtils::addNonEmpty($this->qualifiers, $qualifier ? $qualifier->getFullName() : null, $qualifier); return $this; } /** * Adds qualifiers to the action. * * @param array $qualifiers The qualifiers to add. * * @return $this */ public function addQualifiers(...$qualifiers) { if (count($qualifiers) < 1) { return $this; } // Allow initializing action directly by passing values to the main qualifier // it can be a bit tricky, user is not supposed to pass BaseComponent directly to the action, // but initialize qualifier instead (or qualifier should be initialised for the user) if (! $qualifiers[0] instanceof BaseComponent) { $this->getMainQualifier()->add(...$qualifiers); return $this; } foreach ($qualifiers as $qualifier) { $this->addQualifier($qualifier); } return $this; } /** * Adds (sets) generic (raw) action. * * @param string $action The generic action string. * * @return static */ public function setGenericAction($action) { if (StringUtils::contains($action, '/')) { throw new InvalidArgumentException('A single generic action must be supplied'); } $this->genericAction = $action; return $this; } /** * Sets the flag. * * @param FlagQualifier|null $flag The flag to set. * @param bool $set Indicates whether to set(true) or unset(false) the flag instead. * (Used for avoiding if conditions all over the code) * * @return $this */ public function setFlag(FlagQualifier $flag, $set = true) { if ($set === false) { return $this->unsetFlag($flag); } ArrayUtils::addNonEmpty($this->flags, $flag->getFlagName(), $flag); return $this; } /** * Removes the flag. * * @param FlagQualifier $flag The flag to unset. * * @return $this */ public function unsetFlag(FlagQualifier $flag) { unset($this->flags[$flag->getFlagName()]); return $this; } /** * Imports (merges) qualifiers and flags from another action. * * @param BaseAction|null $action The action to import. * * @return $this */ public function importAction($action) { if ($action === null) { return $this; } $this->qualifiers = ArrayUtils::mergeNonEmpty($this->qualifiers, $action->qualifiers); $this->flags = ArrayUtils::mergeNonEmpty($this->flags, $action->flags); return $this; } /** * Serializes to json. * * @return mixed */ public function jsonSerialize() { $jsonArray = []; ArrayUtils::addNonEmpty($jsonArray, 'qualifiers', self::jsonSerializeQualifiers($this->qualifiers)); ArrayUtils::addNonEmpty($jsonArray, 'generic', $this->genericAction); ArrayUtils::addNonEmpty($jsonArray, 'flags', self::jsonSerializeQualifiers($this->flags)); if (empty($jsonArray)) { return []; } ArrayUtils::prependAssoc($jsonArray, 'name', $this->getFullName()); return $jsonArray; } /** * Collects and flattens action qualifiers. * * @return array A flat array of qualifiers * * @internal */ public function getStringQualifiers() { $flatQualifiers = []; foreach ($this->qualifiers as $qualifier) { $flatQualifiers = ArrayUtils::mergeNonEmpty($flatQualifiers, $qualifier->getStringQualifiers()); } return array_merge($flatQualifiers, [self::serializeFlags($this->flags)], [$this->genericAction]); } /** * Serializes to Cloudinary URL format * * @return string */ public function __toString() { return ArrayUtils::implodeActionQualifiers(...$this->getStringQualifiers()); } /** * Gets the main qualifier, if defined. * * In case the qualifier is not defined, new instance is initialised. * * @return BaseQualifier The main qualifier * * @internal */ protected function getMainQualifier() { $mainQualifierClassName = static::MAIN_QUALIFIER; $mainQualifierKey = $mainQualifierClassName::getName(); if (! isset($this->qualifiers[$mainQualifierKey])) { $this->qualifiers[$mainQualifierKey] = new $mainQualifierClassName(); } return $this->qualifiers[$mainQualifierKey]; } /** * Serializes and merges flags. * * @param array $flags The flags to serialize * * @return string */ protected static function serializeFlags($flags) { return ArrayUtils::implodeActionQualifiers(...array_values($flags)); } /** * Serializes qualifiers to JSON. * * @param array $qualifiers The qualifiers to serialize. * * @return array Serialized qualifiers. */ protected static function jsonSerializeQualifiers($qualifiers) { $result = array_map( static function ($qualifier) { return JsonUtils::jsonSerialize($qualifier); }, array_values($qualifiers) ); return ArrayUtils::safeFilter($result); } }