You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
nextcloud-server/lib/unstable/Config/Lexicon/ConfigLexiconEntry.php

297 lines
7.9 KiB

<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace NCU\Config\Lexicon;
use Closure;
use NCU\Config\ValueType;
/**
* Model that represent config values within an app config lexicon.
*
* @see IConfigLexicon
* @experimental 31.0.0
* @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry
* @see \OCP\Config\Lexicon\Entry
* @psalm-suppress DeprecatedClass
*/
class ConfigLexiconEntry {
/**
* @experimental 32.0.0
* @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry
* @see \OCP\Config\Lexicon\Entry
*/
public const RENAME_INVERT_BOOLEAN = 1;
private string $definition = '';
private ?string $default = null;
/**
* @param string $key config key, can only contain alphanumerical chars and -._
* @param ValueType $type type of config value
* @param string $definition optional description of config key available when using occ command
* @param bool $lazy set config value as lazy
* @param int $flags set flags
* @param string|null $rename previous config key to migrate config value from
* @param bool $deprecated set config key as deprecated
*
* @experimental 31.0.0
* @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry
* @see \OCP\Config\Lexicon\Entry
* @psalm-suppress PossiblyInvalidCast
* @psalm-suppress RiskyCast
*/
public function __construct(
private readonly string $key,
private readonly ValueType $type,
private null|string|int|float|bool|array|Closure $defaultRaw = null,
string $definition = '',
private readonly bool $lazy = false,
private readonly int $flags = 0,
private readonly bool $deprecated = false,
private readonly ?string $rename = null,
private readonly int $options = 0,
) {
// key can only contain alphanumeric chars and underscore "_"
if (preg_match('/[^[:alnum:]_]/', $key)) {
throw new \Exception('invalid config key');
}
/** @psalm-suppress UndefinedClass */
if (\OC::$CLI) { // only store definition if ran from CLI
$this->definition = $definition;
}
}
/**
* returns the config key
*
* @return string config key
* @experimental 31.0.0
* @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry
* @see \OCP\Config\Lexicon\Entry
*/
public function getKey(): string {
return $this->key;
}
/**
* get expected type for config value
*
* @return ValueType
* @experimental 31.0.0
* @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry
* @see \OCP\Config\Lexicon\Entry
* @psalm-suppress DeprecatedClass
*/
public function getValueType(): ValueType {
return $this->type;
}
/**
* @param string $default
* @return string
* @experimental 31.0.0
* @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry
* @see \OCP\Config\Lexicon\Entry
*/
private function convertFromString(string $default): string {
return $default;
}
/**
* @param int $default
* @return string
* @experimental 31.0.0
* @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry
* @see \OCP\Config\Lexicon\Entry
*/
private function convertFromInt(int $default): string {
return (string)$default;
}
/**
* @param float $default
* @return string
* @experimental 31.0.0
* @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry
* @see \OCP\Config\Lexicon\Entry
*/
private function convertFromFloat(float $default): string {
return (string)$default;
}
/**
* @param bool $default
* @return string
* @experimental 31.0.0
* @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry
* @see \OCP\Config\Lexicon\Entry
*/
private function convertFromBool(bool $default): string {
return ($default) ? '1' : '0';
}
/**
* @param array $default
* @return string
* @experimental 31.0.0
* @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry
* @see \OCP\Config\Lexicon\Entry
*/
private function convertFromArray(array $default): string {
return json_encode($default);
}
/**
* returns default value
*
* @return string|null NULL if no default is set
* @experimental 31.0.0
* @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry
* @see \OCP\Config\Lexicon\Entry
* @psalm-suppress DeprecatedClass
* @psalm-suppress DeprecatedMethod
*/
public function getDefault(Preset $preset): ?string {
if ($this->default !== null) {
return $this->default;
}
if ($this->defaultRaw === null) {
return null;
}
if ($this->defaultRaw instanceof Closure) {
/** @psalm-suppress MixedAssignment we expect closure to returns string|int|float|bool|array */
$this->defaultRaw = ($this->defaultRaw)($preset);
}
/** @psalm-suppress MixedArgument closure should be managed previously */
$this->default = $this->convertToString($this->defaultRaw);
return $this->default;
}
/**
* convert $entry into string, based on the expected type for config value
*
* @param string|int|float|bool|array $entry
*
* @return string
* @experimental 31.0.0
* @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry
* @see \OCP\Config\Lexicon\Entry
* @psalm-suppress PossiblyInvalidCast arrays are managed pre-cast
* @psalm-suppress RiskyCast
* @psalm-suppress DeprecatedClass
* @psalm-suppress DeprecatedMethod
* @psalm-suppress DeprecatedConstant
*/
public function convertToString(string|int|float|bool|array $entry): string {
// in case $default is array but is not expected to be an array...
if ($this->getValueType() !== ValueType::ARRAY && is_array($entry)) {
$entry = json_encode($entry, JSON_THROW_ON_ERROR);
}
return match ($this->getValueType()) {
ValueType::MIXED => (string)$entry,
ValueType::STRING => $this->convertFromString((string)$entry),
ValueType::INT => $this->convertFromInt((int)$entry),
ValueType::FLOAT => $this->convertFromFloat((float)$entry),
ValueType::BOOL => $this->convertFromBool((bool)$entry),
ValueType::ARRAY => $this->convertFromArray((array)$entry)
};
}
/**
* returns definition
*
* @return string
* @experimental 31.0.0
* @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry
* @see \OCP\Config\Lexicon\Entry
*/
public function getDefinition(): string {
return $this->definition;
}
/**
* returns if config key is set as lazy
*
* @see IAppConfig for details on lazy config values
* @return bool TRUE if config value is lazy
* @experimental 31.0.0
* @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry
* @see \OCP\Config\Lexicon\Entry
*/
public function isLazy(): bool {
return $this->lazy;
}
/**
* returns flags
*
* @see IAppConfig for details on sensitive config values
* @return int bitflag about the config value
* @experimental 31.0.0
* @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry
* @see \OCP\Config\Lexicon\Entry
*/
public function getFlags(): int {
return $this->flags;
}
/**
* @param int $flag
*
* @return bool TRUE is config value bitflag contains $flag
* @experimental 31.0.0
* @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry
* @see \OCP\Config\Lexicon\Entry
* @psalm-suppress DeprecatedMethod
*/
public function isFlagged(int $flag): bool {
return (($flag & $this->getFlags()) === $flag);
}
/**
* should be called/used only during migration/upgrade.
* link to an old config key.
*
* @return string|null not NULL if value can be imported from a previous key
* @experimental 32.0.0
* @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry
* @see \OCP\Config\Lexicon\Entry
*/
public function getRename(): ?string {
return $this->rename;
}
/**
* @experimental 32.0.0
* @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry
* @see \OCP\Config\Lexicon\Entry
* @return bool TRUE if $option was set during the creation of the entry.
*/
public function hasOption(int $option): bool {
return (($option & $this->options) !== 0);
}
/**
* returns if config key is set as deprecated
*
* @return bool TRUE if config si deprecated
* @experimental 31.0.0
* @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry
* @see \OCP\Config\Lexicon\Entry
*/
public function isDeprecated(): bool {
return $this->deprecated;
}
}