agent/php/ElasticApm/Impl/Config/DurationOptionParser.php (94 lines of code) (raw):

<?php /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright * ownership. Elasticsearch B.V. licenses this file to you under * the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ declare(strict_types=1); namespace Elastic\Apm\Impl\Config; use Elastic\Apm\Impl\Util\ExceptionUtil; use Elastic\Apm\Impl\Util\TextUtil; /** * Code in this file is part of implementation internals and thus it is not covered by the backward compatibility. * * @internal * * @extends OptionParser<float> */ final class DurationOptionParser extends OptionParser { /** @var ?float */ private $minValidValueInMilliseconds; /** @var ?float */ private $maxValidValueInMilliseconds; /** @var int */ private $defaultUnits; public function __construct( ?float $minValidValueInMilliseconds, ?float $maxValidValueInMilliseconds, int $defaultUnits ) { $this->minValidValueInMilliseconds = $minValidValueInMilliseconds; $this->maxValidValueInMilliseconds = $maxValidValueInMilliseconds; $this->defaultUnits = $defaultUnits; } /** @inheritDoc */ public function parse(string $rawValue): float { $partWithoutSuffix = ''; $units = $this->defaultUnits; self::splitToValueAndUnits($rawValue, /* ref */ $partWithoutSuffix, /* ref */ $units); $auxFloatOptionParser = new FloatOptionParser(null /* minValidValue */, null /* maxValidValue */); $parsedValueInMilliseconds = self::convertToMilliseconds($auxFloatOptionParser->parse($partWithoutSuffix), $units); if ( ( ($this->minValidValueInMilliseconds !== null) && ($parsedValueInMilliseconds < $this->minValidValueInMilliseconds) ) || ( ($this->maxValidValueInMilliseconds !== null) && ($parsedValueInMilliseconds > $this->maxValidValueInMilliseconds) ) ) { throw new ParseException( 'Value is not in range between the valid minimum and maximum values.' . ' Raw option value: `' . $rawValue . "'." . ' Parsed option value (in milliseconds): ' . $parsedValueInMilliseconds . '.' . ' The valid minimum value (in milliseconds): ' . $this->minValidValueInMilliseconds . '.' . ' The valid maximum value (in milliseconds): ' . $this->maxValidValueInMilliseconds . '.' ); } return $parsedValueInMilliseconds; } public function defaultUnits(): int { return $this->defaultUnits; } public function minValidValueInMilliseconds(): ?float { return $this->minValidValueInMilliseconds; } public function maxValidValueInMilliseconds(): ?float { return $this->maxValidValueInMilliseconds; } private static function splitToValueAndUnits(string $rawValue, string &$partWithoutSuffix, int &$units): void { foreach (DurationUnits::$suffixAndIdPairs as $suffixAndIdPair) { $suffix = $suffixAndIdPair[0]; if (TextUtil::isSuffixOf($suffix, $rawValue, /* isCaseSensitive */ false)) { $partWithoutSuffix = trim(substr($rawValue, 0, -strlen($suffix))); $units = $suffixAndIdPair[1]; return; } } $partWithoutSuffix = $rawValue; } public static function convertToMilliseconds(float $srcValue, int $srcValueUnits): float { switch ($srcValueUnits) { case DurationUnits::MILLISECONDS: return $srcValue; case DurationUnits::SECONDS: return $srcValue * 1000; case DurationUnits::MINUTES: return $srcValue * 60 * 1000; default: throw new ParseException( ExceptionUtil::buildMessage( 'Not a valid time duration units ID', /* context */ [ 'srcValueUnits' => $srcValueUnits, 'srcValue' => $srcValue, 'valid time duration units' => DurationUnits::$suffixAndIdPairs, ] ) ); } } }