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