Test project for media files management.
<?php
declare(strict_types=1);
/**
* This file is part of the Carbon package.
*
* (c) Brian Nesbitt <brian@nesbot.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Carbon\Traits;
use Carbon\CarbonInterface;
use DateTimeInterface;
use Throwable;
/**
* Trait Options.
*
* Embed base methods to change settings of Carbon classes.
*
* Depends on the following methods:
*
* @method static shiftTimezone($timezone) Set the timezone
*/
trait Options
{
use StaticOptions;
use Localization;
/**
* Indicates if months should be calculated with overflow.
* Specific setting.
*/
protected ?bool $localMonthsOverflow = null;
/**
* Indicates if years should be calculated with overflow.
* Specific setting.
*/
protected ?bool $localYearsOverflow = null;
/**
* Indicates if the strict mode is in use.
* Specific setting.
*/
protected ?bool $localStrictModeEnabled = null;
/**
* Options for diffForHumans and forHumans methods.
*/
protected ?int $localHumanDiffOptions = null;
/**
* Format to use on string cast.
*
* @var string|callable|null
*/
protected $localToStringFormat = null;
/**
* Format to use on JSON serialization.
*
* @var string|callable|null
*/
protected $localSerializer = null;
/**
* Instance-specific macros.
*/
protected ?array $localMacros = null;
/**
* Instance-specific generic macros.
*/
protected ?array $localGenericMacros = null;
/**
* Function to call instead of format.
*
* @var string|callable|null
*/
protected $localFormatFunction = null;
/**
* Set specific options.
* - strictMode: true|false|null
* - monthOverflow: true|false|null
* - yearOverflow: true|false|null
* - humanDiffOptions: int|null
* - toStringFormat: string|Closure|null
* - toJsonFormat: string|Closure|null
* - locale: string|null
* - timezone: \DateTimeZone|string|int|null
* - macros: array|null
* - genericMacros: array|null
*
* @param array $settings
*
* @return $this|static
*/
public function settings(array $settings): static
{
$this->localStrictModeEnabled = $settings['strictMode'] ?? null;
$this->localMonthsOverflow = $settings['monthOverflow'] ?? null;
$this->localYearsOverflow = $settings['yearOverflow'] ?? null;
$this->localHumanDiffOptions = $settings['humanDiffOptions'] ?? null;
$this->localToStringFormat = $settings['toStringFormat'] ?? null;
$this->localSerializer = $settings['toJsonFormat'] ?? null;
$this->localMacros = $settings['macros'] ?? null;
$this->localGenericMacros = $settings['genericMacros'] ?? null;
$this->localFormatFunction = $settings['formatFunction'] ?? null;
if (isset($settings['locale'])) {
$locales = $settings['locale'];
if (!\is_array($locales)) {
$locales = [$locales];
}
$this->locale(...$locales);
} elseif (isset($settings['translator']) && property_exists($this, 'localTranslator')) {
$this->localTranslator = $settings['translator'];
}
if (isset($settings['innerTimezone'])) {
return $this->setTimezone($settings['innerTimezone']);
}
if (isset($settings['timezone'])) {
return $this->shiftTimezone($settings['timezone']);
}
return $this;
}
/**
* Returns current local settings.
*/
public function getSettings(): array
{
$settings = [];
$map = [
'localStrictModeEnabled' => 'strictMode',
'localMonthsOverflow' => 'monthOverflow',
'localYearsOverflow' => 'yearOverflow',
'localHumanDiffOptions' => 'humanDiffOptions',
'localToStringFormat' => 'toStringFormat',
'localSerializer' => 'toJsonFormat',
'localMacros' => 'macros',
'localGenericMacros' => 'genericMacros',
'locale' => 'locale',
'tzName' => 'timezone',
'localFormatFunction' => 'formatFunction',
];
foreach ($map as $property => $key) {
$value = $this->$property ?? null;
if ($value !== null && ($key !== 'locale' || $value !== 'en' || $this->localTranslator)) {
$settings[$key] = $value;
}
}
return $settings;
}
/**
* Show truthy properties on var_dump().
*/
public function __debugInfo(): array
{
$infos = array_filter(get_object_vars($this), static function ($var) {
return $var;
});
foreach (['dumpProperties', 'constructedObjectId', 'constructed', 'originalInput'] as $property) {
if (isset($infos[$property])) {
unset($infos[$property]);
}
}
$this->addExtraDebugInfos($infos);
if (\array_key_exists('carbonRecurrences', $infos)) {
$infos['recurrences'] = $infos['carbonRecurrences'];
unset($infos['carbonRecurrences']);
}
return $infos;
}
protected function isLocalStrictModeEnabled(): bool
{
return $this->localStrictModeEnabled
?? $this->transmitFactory(static fn () => static::isStrictModeEnabled());
}
protected function addExtraDebugInfos(array &$infos): void
{
if ($this instanceof DateTimeInterface) {
try {
$infos['date'] ??= $this->format(CarbonInterface::MOCK_DATETIME_FORMAT);
$infos['timezone'] ??= $this->tzName ?? $this->timezoneSetting ?? $this->timezone ?? null;
} catch (Throwable) {
// noop
}
}
}
}