Chris@2: , Sebastian Heuer , Sebastian Bergmann Chris@2: * Chris@2: * For the full copyright and license information, please view the LICENSE Chris@2: * file that was distributed with this source code. Chris@2: */ Chris@2: Chris@2: namespace PharIo\Version; Chris@2: Chris@2: class VersionConstraintParser { Chris@2: /** Chris@2: * @param string $value Chris@2: * Chris@2: * @return VersionConstraint Chris@2: * Chris@2: * @throws UnsupportedVersionConstraintException Chris@2: */ Chris@2: public function parse($value) { Chris@2: Chris@2: if (strpos($value, '||') !== false) { Chris@2: return $this->handleOrGroup($value); Chris@2: } Chris@2: Chris@2: if (!preg_match('/^[\^~\*]?[\d.\*]+$/', $value)) { Chris@2: throw new UnsupportedVersionConstraintException( Chris@2: sprintf('Version constraint %s is not supported.', $value) Chris@2: ); Chris@2: } Chris@2: Chris@2: switch ($value[0]) { Chris@2: case '~': Chris@2: return $this->handleTildeOperator($value); Chris@2: case '^': Chris@2: return $this->handleCaretOperator($value); Chris@2: } Chris@2: Chris@2: $version = new VersionConstraintValue($value); Chris@2: Chris@2: if ($version->getMajor()->isAny()) { Chris@2: return new AnyVersionConstraint(); Chris@2: } Chris@2: Chris@2: if ($version->getMinor()->isAny()) { Chris@2: return new SpecificMajorVersionConstraint( Chris@2: $value, Chris@2: $version->getMajor()->getValue() Chris@2: ); Chris@2: } Chris@2: Chris@2: if ($version->getPatch()->isAny()) { Chris@2: return new SpecificMajorAndMinorVersionConstraint( Chris@2: $value, Chris@2: $version->getMajor()->getValue(), Chris@2: $version->getMinor()->getValue() Chris@2: ); Chris@2: } Chris@2: Chris@2: return new ExactVersionConstraint($value); Chris@2: } Chris@2: Chris@2: /** Chris@2: * @param $value Chris@2: * Chris@2: * @return OrVersionConstraintGroup Chris@2: */ Chris@2: private function handleOrGroup($value) { Chris@2: $constraints = []; Chris@2: Chris@2: foreach (explode('||', $value) as $groupSegment) { Chris@2: $constraints[] = $this->parse(trim($groupSegment)); Chris@2: } Chris@2: Chris@2: return new OrVersionConstraintGroup($value, $constraints); Chris@2: } Chris@2: Chris@2: /** Chris@2: * @param string $value Chris@2: * Chris@2: * @return AndVersionConstraintGroup Chris@2: */ Chris@2: private function handleTildeOperator($value) { Chris@2: $version = new Version(substr($value, 1)); Chris@2: $constraints = [ Chris@2: new GreaterThanOrEqualToVersionConstraint($value, $version) Chris@2: ]; Chris@2: Chris@2: if ($version->getPatch()->isAny()) { Chris@2: $constraints[] = new SpecificMajorVersionConstraint( Chris@2: $value, Chris@2: $version->getMajor()->getValue() Chris@2: ); Chris@2: } else { Chris@2: $constraints[] = new SpecificMajorAndMinorVersionConstraint( Chris@2: $value, Chris@2: $version->getMajor()->getValue(), Chris@2: $version->getMinor()->getValue() Chris@2: ); Chris@2: } Chris@2: Chris@2: return new AndVersionConstraintGroup($value, $constraints); Chris@2: } Chris@2: Chris@2: /** Chris@2: * @param string $value Chris@2: * Chris@2: * @return AndVersionConstraintGroup Chris@2: */ Chris@2: private function handleCaretOperator($value) { Chris@2: $version = new Version(substr($value, 1)); Chris@2: Chris@2: return new AndVersionConstraintGroup( Chris@2: $value, Chris@2: [ Chris@2: new GreaterThanOrEqualToVersionConstraint($value, $version), Chris@2: new SpecificMajorVersionConstraint($value, $version->getMajor()->getValue()) Chris@2: ] Chris@2: ); Chris@2: } Chris@2: }