package main

import (
	"io"

	"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
	"google.golang.org/genproto/googleapis/api/httpbody"
)

// rawBodyMarshaler — маршалер для бинарного тела (application/zip и др.):
// запрос попадает в HttpBody.Data без base64-JSON, для остального делегирует
// JSON-маршалеру (работает и {"data": "<base64>"}).
type rawBodyMarshaler struct {
	runtime.Marshaler
}

func (m *rawBodyMarshaler) NewDecoder(r io.Reader) runtime.Decoder {
	return rawBodyDecoder{
		Decoder: m.Marshaler.NewDecoder(r),
		r:       r,
	}
}

// rawBodyDecoder — Decoder: для *httpbody.HttpBody читает тело целиком в Data,
// для protobuf-сообщений декодирует JSON как обычно.
type rawBodyDecoder struct {
	runtime.Decoder
	r io.Reader
}

func (d rawBodyDecoder) Decode(v interface{}) error {
	if body, ok := v.(*httpbody.HttpBody); ok {
		data, err := io.ReadAll(d.r)
		if err != nil {
			return err
		}
		body.Data = data
		return nil
	}
	return d.Decoder.Decode(v)
}
