// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Package protoiface contains types referenced or implemented by messages.
//
// WARNING: This package should only be imported by message implementations.
// The functionality found in this package should be accessed through
// higher-level abstractions provided by the proto package.
package protoiface

import (
	"google.golang.org/protobuf/internal/pragma"
	"google.golang.org/protobuf/reflect/protoreflect"
)

// Methods is a set of optional fast-path implementations of various operations.
type Methods = struct {
	pragma.NoUnkeyedLiterals

	// Flags indicate support for optional features.
	Flags SupportFlags

	// Size returns the size in bytes of the wire-format encoding of m.
	// MarshalAppend must be provided if a custom Size is provided.
	Size func(m protoreflect.Message, opts MarshalOptions) int

	// Marshal writes the wire-format encoding of m to the provided buffer.
	// Size should be provided if a custom MarshalAppend is provided.
	// It must not return an error for a partial message.
	Marshal func(m protoreflect.Message, in MarshalInput, opts MarshalOptions) (MarshalOutput, error)

	// Unmarshal parses the wire-format encoding of a message and merges the result to m.
	// It must not reset the target message or return an error for a partial message.
	Unmarshal func(m protoreflect.Message, in UnmarshalInput, opts UnmarshalOptions) (UnmarshalOutput, error)

	// IsInitialized returns an error if any required fields in m are not set.
	IsInitialized func(m protoreflect.Message) error

	// Merge merges src into dst.
	Merge func(dst, src protoreflect.Message, in MergeInput, opts MergeOptions) MergeOutput
}

type SupportFlags = uint64

const (
	// SupportMarshalDeterministic reports whether MarshalOptions.Deterministic is supported.
	SupportMarshalDeterministic SupportFlags = 1 << iota

	// SupportUnmarshalDiscardUnknown reports whether UnmarshalOptions.DiscardUnknown is supported.
	SupportUnmarshalDiscardUnknown
)

// MarshalInput is input to the marshaler.
type MarshalInput = struct {
	pragma.NoUnkeyedLiterals

	Buf []byte // output is appended to this buffer
}

// MarshalOutput is output from the marshaler.
type MarshalOutput = struct {
	pragma.NoUnkeyedLiterals

	Buf []byte // contains marshaled message
}

// MarshalOptions configure the marshaler.
type MarshalOptions = struct {
	pragma.NoUnkeyedLiterals

	Flags MarshalFlags
}

// MarshalFlags are configure the marshaler.
// Most flags correspond to fields in proto.MarshalOptions.
type MarshalFlags = uint8

const (
	MarshalDeterministic MarshalFlags = 1 << iota
	MarshalUseCachedSize
)

// UnmarshalInput is input to the unmarshaler.
type UnmarshalInput = struct {
	pragma.NoUnkeyedLiterals

	Buf []byte // input buffer
}

// UnmarshalOutput is output from the unmarshaler.
type UnmarshalOutput = struct {
	pragma.NoUnkeyedLiterals

	// Initialized may be set on return if all required fields are known to be set.
	// A value of false does not indicate that the message is uninitialized, only
	// that its status could not be confirmed.
	Initialized bool
}

// UnmarshalOptions configures the unmarshaler.
type UnmarshalOptions = struct {
	pragma.NoUnkeyedLiterals

	Flags    UnmarshalFlags
	Resolver interface {
		FindExtensionByName(field protoreflect.FullName) (protoreflect.ExtensionType, error)
		FindExtensionByNumber(message protoreflect.FullName, field protoreflect.FieldNumber) (protoreflect.ExtensionType, error)
	}
}

// UnmarshalFlags configure the unmarshaler.
// Most flags correspond to fields in proto.UnmarshalOptions.
type UnmarshalFlags = uint8

const (
	UnmarshalDiscardUnknown UnmarshalFlags = 1 << iota
)

// MergeInput is input to the merger.
type MergeInput = struct {
	pragma.NoUnkeyedLiterals
}

// MergeOutput is output from the merger.
type MergeOutput = struct {
	pragma.NoUnkeyedLiterals

	// Merged is true if the merge was performed, false otherwise.
	// If false, the merger must have made no changes to the destination.
	Merged bool
}

// MergeOptions configure the merger.
type MergeOptions = struct {
	pragma.NoUnkeyedLiterals
}
