123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- <?php
- namespace Aws\Api\Serializer;
- use Aws\Api\StructureShape;
- use Aws\Api\ListShape;
- use Aws\Api\MapShape;
- use Aws\Api\Shape;
- use Aws\Api\TimestampShape;
- /**
- * @internal
- */
- class QueryParamBuilder
- {
- private $methods;
- protected function queryName(Shape $shape, $default = null)
- {
- if (null !== $shape['queryName']) {
- return $shape['queryName'];
- }
- if (null !== $shape['locationName']) {
- return $shape['locationName'];
- }
- if ($this->isFlat($shape) && !empty($shape['member']['locationName'])) {
- return $shape['member']['locationName'];
- }
- return $default;
- }
- protected function isFlat(Shape $shape)
- {
- return $shape['flattened'] === true;
- }
- public function __invoke(StructureShape $shape, array $params)
- {
- if (!$this->methods) {
- $this->methods = array_fill_keys(get_class_methods($this), true);
- }
- $query = [];
- $this->format_structure($shape, $params, '', $query);
- return $query;
- }
- protected function format(Shape $shape, $value, $prefix, array &$query)
- {
- $type = 'format_' . $shape['type'];
- if (isset($this->methods[$type])) {
- $this->{$type}($shape, $value, $prefix, $query);
- } else {
- $query[$prefix] = (string) $value;
- }
- }
- protected function format_structure(
- StructureShape $shape,
- array $value,
- $prefix,
- &$query
- ) {
- if ($prefix) {
- $prefix .= '.';
- }
- foreach ($value as $k => $v) {
- if ($shape->hasMember($k)) {
- $member = $shape->getMember($k);
- $this->format(
- $member,
- $v,
- $prefix . $this->queryName($member, $k),
- $query
- );
- }
- }
- }
- protected function format_list(
- ListShape $shape,
- array $value,
- $prefix,
- &$query
- ) {
- // Handle empty list serialization
- if (!$value) {
- $query[$prefix] = '';
- return;
- }
- $items = $shape->getMember();
- if (!$this->isFlat($shape)) {
- $locationName = $shape->getMember()['locationName'] ?: 'member';
- $prefix .= ".$locationName";
- } elseif ($name = $this->queryName($items)) {
- $parts = explode('.', $prefix);
- $parts[count($parts) - 1] = $name;
- $prefix = implode('.', $parts);
- }
- foreach ($value as $k => $v) {
- $this->format($items, $v, $prefix . '.' . ($k + 1), $query);
- }
- }
- protected function format_map(
- MapShape $shape,
- array $value,
- $prefix,
- array &$query
- ) {
- $vals = $shape->getValue();
- $keys = $shape->getKey();
- if (!$this->isFlat($shape)) {
- $prefix .= '.entry';
- }
- $i = 0;
- $keyName = '%s.%d.' . $this->queryName($keys, 'key');
- $valueName = '%s.%s.' . $this->queryName($vals, 'value');
- foreach ($value as $k => $v) {
- $i++;
- $this->format($keys, $k, sprintf($keyName, $prefix, $i), $query);
- $this->format($vals, $v, sprintf($valueName, $prefix, $i), $query);
- }
- }
- protected function format_blob(Shape $shape, $value, $prefix, array &$query)
- {
- $query[$prefix] = base64_encode($value);
- }
- protected function format_timestamp(
- TimestampShape $shape,
- $value,
- $prefix,
- array &$query
- ) {
- $timestampFormat = !empty($shape['timestampFormat'])
- ? $shape['timestampFormat']
- : 'iso8601';
- $query[$prefix] = TimestampShape::format($value, $timestampFormat);
- }
- protected function format_boolean(Shape $shape, $value, $prefix, array &$query)
- {
- $query[$prefix] = ($value) ? 'true' : 'false';
- }
- }
|