NAME

IO::K8s::List - Generic list container for Kubernetes API responses

VERSION

version 1.108

SYNOPSIS

use IO::K8s::List;

my $list = IO::K8s::List->new(
    items => \@pods,
    metadata => $list_meta,
);

# apiVersion and kind are derived from items
print $list->api_version;  # v1
print $list->kind;         # PodList

DESCRIPTION

Generic container for Kubernetes list responses. Instead of having separate PodList, ServiceList, DeploymentList classes, this single class handles all list types.

The apiVersion and kind are automatically derived from the items.

items

Array of Kubernetes API objects. Required.

metadata

List metadata (IO::K8s::Apimachinery::Pkg::Apis::Meta::V1::ListMeta). Contains pagination info like continue and resourceVersion.

item_class

Optional. The class of items in the list. If not provided, derived from the first item. Used for empty lists where the type can't be inferred, or to override the item type "FROM_STRUCT" would otherwise derive.

Accepted only as a fully-qualified class name, exactly like every other class-name-taking parameter in this distribution: a leading + is stripped before use ("this is already a full class name"), and a short or partially-qualified name is not guessed at -- "kind" and "api_version" simply have nothing to derive from it (k49).

api_version

Returns the Kubernetes API version, derived from items or item_class.

kind

Returns the Kubernetes kind (e.g., "PodList"), derived from items or item_class. For an item_class the Kind is its last :: segment, or the whole name for a single-segment class such as a CRD registered as +Widget -- but only when "api_version" can also resolve for the same item_class; otherwise undef, never a Kind with no apiVersion to go with it (k49).

FROM_STRUCT

my $list = IO::K8s::List->FROM_STRUCT($struct, $k8s);

Inflation hook called by "inflate" in IO::K8s (and so by json_to_object and struct_to_object) whenever the wire kind is List or ends in List -- the shape every real Kubernetes API list response has, and the generic kind: List wrapper besides. Upstream a list response carries no apiVersion/kind on the individual items (the API server omits them there), so the item type is derived from the LIST's own Kind and apiVersion: kind: PodList, apiVersion: v1 means items are v1/Pod.

item_class travels as a sibling key of kind/apiVersion/items in the struct to override the derived type -- the same "use this class, don't derive one" meaning it already has for an empty list built directly via new. It is the only way to inflate a bare kind: List payload, whose Kind minus its List suffix is empty and so derives nothing on its own.

Fails closed (k39/k46): an item Kind that cannot be resolved to a class dies with the same "Cannot resolve Kubernetes GVK" error every other entry point in this distribution uses, naming the ITEM's kind/apiVersion, never a silently empty or half-inflated list.

TO_JSON

my $struct = $list->TO_JSON;

Returns the canonical wire-format hashref for the list: apiVersion and kind when "api_version" and "kind" can derive them, plus an items array of each entry's own TO_JSON (untouched when an item is not a blessed object with a TO_JSON method) and metadata when set. This is the inverse of "FROM_STRUCT" and the input "to_json" runs through its JSON encoder.

to_json

my $json_bytes = $list->to_json;

Serializes the List to a canonical JSON document as a UTF-8 encoded byte string -- the same convention every IO::K8s::Role::Resource class uses (k53), and the input "from_json" reads back (k64).

from_json

my $list = IO::K8s::List->from_json($json_bytes);
my $list = IO::K8s::List->from_json($json_bytes, $k8s);

Builds a List from a JSON document, symmetric to "to_json". The argument is a UTF-8 encoded byte string -- exactly what to_json emits -- and is decoded and handed to "FROM_STRUCT", so the items inflate to typed objects the same way "inflate" in IO::K8s does. Pass an IO::K8s instance as the second argument when the item types must resolve through that instance's providers or class_namespaces; without one a shared default instance is used, as FROM_STRUCT does.

List composes IO::K8s::Role::Resource (since k99) so its top-level envelope gets the same _unknown_fields bag and strict handling as every other resource, but it is a container, not an API object with its own GVK, so to_json/from_json/TO_JSON/FROM_STRUCT stay hand-rolled overrides rather than the role's own -- kind/api_version derive from the items, not from a class name. $k8s->inflate reaches the same FROM_STRUCT path from a full wire payload and remains the entry point when the Kind is only known at runtime.

SUPPORT

Issues

Please report bugs and feature requests on GitHub at https://github.com/pplu/io-k8s-p5/issues.

CONTRIBUTING

Contributions are welcome! Please fork the repository and submit a pull request.

AUTHORS

  • Torsten Raudssus <getty@cpan.org>

  • Jose Luis Martinez Torres <jlmartin@cpan.org>

COPYRIGHT AND LICENSE

This software is Copyright (c) 2018-2026 by Jose Luis Martinez Torres <jlmartin@cpan.org>.

This is free software, licensed under:

The Apache License, Version 2.0, January 2004