namespace Code_Snippets\Cloud;
use Code_Snippets\Data_Item;
* A list of snippets as retrieved from the cloud API.
* @property Cloud_Snippet[] $snippets List of snippet items for the current page.
* @property integer $page Page of data that this data belongs to.
* @property integer $total_pages Total number of available pages of items.
* @property integer $total_snippets Total number of available snippet items.
* @property array $cloud_id_rev An array of all cloud snippet IDs and their revision numbers.
* @property bool $success If the request has any results.
class Cloud_Snippets extends Data_Item {
* @param array<string, Cloud_Snippet[]|integer> $initial_data Initial data.
public function __construct( $initial_data = null ) {
$initial_data = $this->normalize_cloud_api( $initial_data );
'total_items' => 'total_snippets',
'cloud_id_rev' => 'cloud_id_rev',
* Prepare a value before it is stored.
* @param mixed $value Value to prepare.
* @param string $field Field name.
* @return mixed Value in the correct format.
protected function prepare_field( $value, string $field ) {
* Prepare the `snippets` field by ensuring it is a list of Cloud_Snippets objects.
* @param mixed $snippets The field as provided.
* @return Cloud_Snippets[] The field in the correct format.
protected function prepare_snippets( $snippets ): array {
$snippets = is_array( $snippets ) ? $snippets : [ $snippets ];
foreach ( $snippets as $snippet ) {
$result[] = $snippet instanceof Cloud_Snippet ? $snippet : new Cloud_Snippet( $snippet );
* Normalize payloads returned by the cloud API into the shape expected by this class.
* @param mixed $initial_data Raw data passed into the constructor.
* @return mixed Normalized data array or original value when no normalization is required.
private function normalize_cloud_api( $initial_data ) {
// pagination metadata is nested under a 'meta' key.
if ( is_array( $initial_data ) && isset( $initial_data['meta'] ) ) {
$meta = $initial_data['meta'];
$normalized['snippets'] = $initial_data['snippets'] ?? $initial_data['data'] ?? [];
$normalized['total_snippets'] = isset( $meta['total'] ) ? (int) $meta['total'] : 0;
$normalized['total_pages'] = isset( $meta['total_pages'] ) ? (int) $meta['total_pages'] : 0;
$normalized['page'] = isset( $meta['page'] ) ? max( 0, (int) $meta['page'] - 1 ) : 0;
$normalized['cloud_id_rev'] = $initial_data['cloud_id_rev'] ?? [];
$initial_data = $normalized;