| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 | <?phpnamespace 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';    }}
 |