File: /home/xedaptot/be.naniguide.com/vendor/anthropic-ai/sdk/src/Page.php
<?php
namespace Anthropic;
use Anthropic\Core\Attributes\Optional;
use Anthropic\Core\Concerns\SdkModel;
use Anthropic\Core\Concerns\SdkPage;
use Anthropic\Core\Contracts\BaseModel;
use Anthropic\Core\Contracts\BasePage;
use Anthropic\Core\Conversion;
use Anthropic\Core\Conversion\Contracts\Converter;
use Anthropic\Core\Conversion\Contracts\ConverterSource;
use Anthropic\Core\Conversion\ListOf;
use Psr\Http\Message\ResponseInterface;
/**
* @phpstan-type PageShape = array{
* data?: list<mixed>|null,
* hasMore?: bool|null,
* firstID?: string|null,
* lastID?: string|null,
* }
*
* @template TItem
*
* @implements BasePage<TItem>
*/
final class Page implements BaseModel, BasePage
{
/** @use SdkModel<PageShape> */
use SdkModel;
/** @use SdkPage<TItem> */
use SdkPage;
/** @var list<TItem>|null $data */
#[Optional(list: 'mixed')]
public ?array $data;
#[Optional('has_more')]
public ?bool $hasMore;
#[Optional('first_id', nullable: true)]
public ?string $firstID;
#[Optional('last_id', nullable: true)]
public ?string $lastID;
/**
* @internal
*
* @param array{
* method: string,
* path: string,
* query: array<string,mixed>,
* headers: array<string,string|list<string>|null>,
* body: mixed,
* } $requestInfo
*/
public function __construct(
private string|Converter|ConverterSource $convert,
private Client $client,
private array $requestInfo,
private RequestOptions $options,
private ResponseInterface $response,
private mixed $parsedBody,
) {
$this->initialize();
if (!is_array($this->parsedBody)) {
return;
}
// @phpstan-ignore-next-line argument.type
self::__unserialize($this->parsedBody);
if (is_array($items = $this->offsetGet('data'))) {
$parsed = Conversion::coerce(new ListOf($convert), value: $items);
// @phpstan-ignore-next-line
$this->offsetSet('data', value: $parsed);
}
}
/** @return list<TItem> */
public function getItems(): array
{
// @phpstan-ignore-next-line return.type
return $this->offsetGet('data') ?? [];
}
/**
* @internal
*
* @return array{
* array{
* method: string,
* path: string,
* query: array<string,mixed>,
* headers: array<string,string|list<string>|null>,
* body: mixed,
* },
* RequestOptions,
* }|null
*/
public function nextRequest(): ?array
{
if (!($this->hasMore ?? null) || !count($this->getItems())) {
return null;
}
if (!($prev = $this->firstID ?? null) && !($next = $this->lastID ?? null)) {
return null;
}
$nextRequest = array_merge_recursive(
$this->requestInfo,
[
'query' => empty($prev) ? ['after_id' => $next] : ['before_id' => $prev],
],
);
// @phpstan-ignore-next-line return.type
return [$nextRequest, $this->options];
}
}