diff options
Diffstat (limited to 'lib/unstable')
-rw-r--r-- | lib/unstable/Config/Lexicon/ConfigLexiconEntry.php | 49 | ||||
-rw-r--r-- | lib/unstable/Config/Lexicon/Preset.php | 46 |
2 files changed, 90 insertions, 5 deletions
diff --git a/lib/unstable/Config/Lexicon/ConfigLexiconEntry.php b/lib/unstable/Config/Lexicon/ConfigLexiconEntry.php index d7d781d8e26..068d89ce764 100644 --- a/lib/unstable/Config/Lexicon/ConfigLexiconEntry.php +++ b/lib/unstable/Config/Lexicon/ConfigLexiconEntry.php @@ -8,6 +8,7 @@ declare(strict_types=1); namespace NCU\Config\Lexicon; +use Closure; use NCU\Config\ValueType; /** @@ -17,15 +18,19 @@ use NCU\Config\ValueType; * @experimental 31.0.0 */ class ConfigLexiconEntry { + /** @experimental 32.0.0 */ + public const RENAME_INVERT_BOOLEAN = 1; + private string $definition = ''; private ?string $default = null; /** - * @param string $key config key + * @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 @@ -35,12 +40,19 @@ class ConfigLexiconEntry { public function __construct( private readonly string $key, private readonly ValueType $type, - private null|string|int|float|bool|array $defaultRaw = null, + 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; @@ -118,15 +130,23 @@ class ConfigLexiconEntry { * @return string|null NULL if no default is set * @experimental 31.0.0 */ - public function getDefault(): ?string { + public function getDefault(Preset $preset): ?string { + if ($this->default !== null) { + return $this->default; + } + if ($this->defaultRaw === null) { return null; } - if ($this->default === null) { - $this->default = $this->convertToString($this->defaultRaw); + 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; } @@ -199,6 +219,25 @@ class ConfigLexiconEntry { } /** + * 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 + */ + public function getRename(): ?string { + return $this->rename; + } + + /** + * @experimental 32.0.0 + * @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 diff --git a/lib/unstable/Config/Lexicon/Preset.php b/lib/unstable/Config/Lexicon/Preset.php new file mode 100644 index 00000000000..92a6fd8cbfa --- /dev/null +++ b/lib/unstable/Config/Lexicon/Preset.php @@ -0,0 +1,46 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + +namespace NCU\Config\Lexicon; + +/** + * list of preset to handle the default behavior of the instance + * + * @see ConfigLexiconEntry::preset + * + * - **Preset::LARGE** - Large size organisation (> 50k accounts) + * - **Preset::MEDIUM** - Medium size organisation (> 100 accounts) + * - **Preset::SMALL** - Small size organisation (< 100 accounts) + * - **Preset::SHARED** - Shared hosting + * - **Preset::EDUCATION** - School/University + * - **Preset::CLUB** - Club/Association + * - **Preset::FAMILY** - Family + * - **Preset::PRIVATE** - Private + * + * @experimental 32.0.0 + */ +enum Preset: int { + /** @experimental 32.0.0 */ + case LARGE = 8; + /** @experimental 32.0.0 */ + case MEDIUM = 7; + /** @experimental 32.0.0 */ + case SMALL = 6; + /** @experimental 32.0.0 */ + case SHARED = 5; + /** @experimental 32.0.0 */ + case EDUCATION = 4; + /** @experimental 32.0.0 */ + case CLUB = 3; + /** @experimental 32.0.0 */ + case FAMILY = 2; + /** @experimental 32.0.0 */ + case PRIVATE = 1; + /** @experimental 32.0.0 */ + case NONE = 0; +} |