Mercurial > hg > isophonics-drupal-site
diff vendor/symfony/serializer/Normalizer/DateTimeNormalizer.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children | 1fec387a4317 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/symfony/serializer/Normalizer/DateTimeNormalizer.php Wed Nov 29 16:09:58 2017 +0000 @@ -0,0 +1,129 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Serializer\Normalizer; + +use Symfony\Component\Serializer\Exception\InvalidArgumentException; +use Symfony\Component\Serializer\Exception\UnexpectedValueException; + +/** + * Normalizes an object implementing the {@see \DateTimeInterface} to a date string. + * Denormalizes a date string to an instance of {@see \DateTime} or {@see \DateTimeImmutable}. + * + * @author Kévin Dunglas <dunglas@gmail.com> + */ +class DateTimeNormalizer implements NormalizerInterface, DenormalizerInterface +{ + const FORMAT_KEY = 'datetime_format'; + + /** + * @var string + */ + private $format; + + /** + * @param string $format + */ + public function __construct($format = \DateTime::RFC3339) + { + $this->format = $format; + } + + /** + * {@inheritdoc} + * + * @throws InvalidArgumentException + */ + public function normalize($object, $format = null, array $context = array()) + { + if (!$object instanceof \DateTimeInterface) { + throw new InvalidArgumentException('The object must implement the "\DateTimeInterface".'); + } + + $format = isset($context[self::FORMAT_KEY]) ? $context[self::FORMAT_KEY] : $this->format; + + return $object->format($format); + } + + /** + * {@inheritdoc} + */ + public function supportsNormalization($data, $format = null) + { + return $data instanceof \DateTimeInterface; + } + + /** + * {@inheritdoc} + * + * @throws UnexpectedValueException + */ + public function denormalize($data, $class, $format = null, array $context = array()) + { + $dateTimeFormat = isset($context[self::FORMAT_KEY]) ? $context[self::FORMAT_KEY] : null; + + if (null !== $dateTimeFormat) { + $object = \DateTime::class === $class ? \DateTime::createFromFormat($dateTimeFormat, $data) : \DateTimeImmutable::createFromFormat($dateTimeFormat, $data); + + if (false !== $object) { + return $object; + } + + $dateTimeErrors = \DateTime::class === $class ? \DateTime::getLastErrors() : \DateTimeImmutable::getLastErrors(); + + throw new UnexpectedValueException(sprintf( + 'Parsing datetime string "%s" using format "%s" resulted in %d errors:'."\n".'%s', + $data, + $dateTimeFormat, + $dateTimeErrors['error_count'], + implode("\n", $this->formatDateTimeErrors($dateTimeErrors['errors'])) + )); + } + + try { + return \DateTime::class === $class ? new \DateTime($data) : new \DateTimeImmutable($data); + } catch (\Exception $e) { + throw new UnexpectedValueException($e->getMessage(), $e->getCode(), $e); + } + } + + /** + * {@inheritdoc} + */ + public function supportsDenormalization($data, $type, $format = null) + { + $supportedTypes = array( + \DateTimeInterface::class => true, + \DateTimeImmutable::class => true, + \DateTime::class => true, + ); + + return isset($supportedTypes[$type]); + } + + /** + * Formats datetime errors. + * + * @param array $errors + * + * @return string[] + */ + private function formatDateTimeErrors(array $errors) + { + $formattedErrors = array(); + + foreach ($errors as $pos => $message) { + $formattedErrors[] = sprintf('at position %d: %s', $pos, $message); + } + + return $formattedErrors; + } +}