package wmo

import (
	"context"
)

func (c *Coll[TData]) decodeSingle(ctx context.Context, dec Decodable) (TData, error) {
	if c.customDecoder != nil {

		return (*c.customDecoder)(ctx, dec)

	} else {

		var res TData

		err := dec.Decode(&res)
		if err != nil {
			return *new(TData), err
		}

		return res, nil

	}
}

func (c *Coll[TData]) decodeAll(ctx context.Context, cursor Cursorable) ([]TData, error) {
	if c.customDecoder != nil {

		res := make([]TData, 0, cursor.RemainingBatchLength())

		for cursor.Next(ctx) {
			entry, err := (*c.customDecoder)(ctx, cursor)
			if err != nil {
				return nil, err
			}
			res = append(res, entry)
		}

		return res, nil

	} else {

		res := make([]TData, 0, cursor.RemainingBatchLength())

		err := cursor.All(ctx, &res)
		if err != nil {
			return nil, err
		}

		return res, nil

	}

}