<?php

namespace Aws\Api;

use RuntimeException;

/**
 * Represents a map shape.
 */
class MapShape extends Shape {
	/** @var Shape */
	private $value;

	/** @var Shape */
	private $key;

	public function __construct( array $definition, ShapeMap $shapeMap ) {
		$definition['type'] = 'map';
		parent::__construct( $definition, $shapeMap );
	}

	/**
	 * @return Shape
	 * @throws RuntimeException if no value is specified
	 */
	public function getValue() {
		if ( ! $this->value ) {
			if ( ! isset( $this->definition['value'] ) ) {
				throw new RuntimeException( 'No value specified' );
			}

			$this->value = Shape::create(
				$this->definition['value'],
				$this->shapeMap
			);
		}

		return $this->value;
	}

	/**
	 * @return Shape
	 */
	public function getKey() {
		if ( ! $this->key ) {
			$this->key = isset( $this->definition['key'] )
				? Shape::create( $this->definition['key'], $this->shapeMap )
				: new Shape( [ 'type' => 'string' ], $this->shapeMap );
		}

		return $this->key;
	}
}
