netglue/prismic-php-kit

View on GitHub
src/Prismic/Document/Fragment/GeoPoint.php

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
<?php
declare(strict_types=1);

namespace Prismic\Document\Fragment;

use JsonSerializable;
use Prismic\Exception\InvalidArgumentException;
use function is_float;
use function json_encode;
use function sprintf;

class GeoPoint implements FragmentInterface, JsonSerializable
{
    /** @var float */
    private $latitude;

    /** @var float */
    private $longitude;

    private function __construct(float $lat, float $lng)
    {
        $this->latitude  = $lat;
        $this->longitude = $lng;
    }

    public static function factory($value) : self
    {
        if (isset($value->value)) {
            $value = $value->value;
        }
        $latitude = isset($value->latitude) ? (float) $value->latitude : null;
        $longitude = isset($value->longitude) ? (float) $value->longitude : null;
        if (! is_float($longitude) || ! is_float($latitude)) {
            throw new InvalidArgumentException(sprintf(
                'Expected an object containing latitude and longitude values, received: %s',
                json_encode($value)
            ));
        }
        return new static($latitude, $longitude);
    }

    public function getLatitude() : float
    {
        return $this->latitude;
    }

    public function getLongitude() : float
    {
        return $this->longitude;
    }

    public function asHtml() :? string
    {
        return sprintf(
            '<span class="geopoint" data-latitude="%1$s" data-longitude="%2$s">%1$s, %2$s</span>',
            $this->latitude,
            $this->longitude
        );
    }

    public function asText() :? string
    {
        return sprintf('%f, %f', $this->latitude, $this->longitude);
    }

    public function jsonSerialize() : array
    {
        return [
            'latitude' => $this->latitude,
            'longitude' => $this->longitude,
        ];
    }
}