xref: /aosp_15_r20/external/golang-protobuf/runtime/protoiface/methods.go (revision 1c12ee1efe575feb122dbf939ff15148a3b3e8f2)
1// Copyright 2019 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// Package protoiface contains types referenced or implemented by messages.
6//
7// WARNING: This package should only be imported by message implementations.
8// The functionality found in this package should be accessed through
9// higher-level abstractions provided by the proto package.
10package protoiface
11
12import (
13	"google.golang.org/protobuf/internal/pragma"
14	"google.golang.org/protobuf/reflect/protoreflect"
15)
16
17// Methods is a set of optional fast-path implementations of various operations.
18type Methods = struct {
19	pragma.NoUnkeyedLiterals
20
21	// Flags indicate support for optional features.
22	Flags SupportFlags
23
24	// Size returns the size in bytes of the wire-format encoding of a message.
25	// Marshal must be provided if a custom Size is provided.
26	Size func(SizeInput) SizeOutput
27
28	// Marshal formats a message in the wire-format encoding to the provided buffer.
29	// Size should be provided if a custom Marshal is provided.
30	// It must not return an error for a partial message.
31	Marshal func(MarshalInput) (MarshalOutput, error)
32
33	// Unmarshal parses the wire-format encoding and merges the result into a message.
34	// It must not reset the target message or return an error for a partial message.
35	Unmarshal func(UnmarshalInput) (UnmarshalOutput, error)
36
37	// Merge merges the contents of a source message into a destination message.
38	Merge func(MergeInput) MergeOutput
39
40	// CheckInitialized returns an error if any required fields in the message are not set.
41	CheckInitialized func(CheckInitializedInput) (CheckInitializedOutput, error)
42}
43
44// SupportFlags indicate support for optional features.
45type SupportFlags = uint64
46
47const (
48	// SupportMarshalDeterministic reports whether MarshalOptions.Deterministic is supported.
49	SupportMarshalDeterministic SupportFlags = 1 << iota
50
51	// SupportUnmarshalDiscardUnknown reports whether UnmarshalOptions.DiscardUnknown is supported.
52	SupportUnmarshalDiscardUnknown
53)
54
55// SizeInput is input to the Size method.
56type SizeInput = struct {
57	pragma.NoUnkeyedLiterals
58
59	Message protoreflect.Message
60	Flags   MarshalInputFlags
61}
62
63// SizeOutput is output from the Size method.
64type SizeOutput = struct {
65	pragma.NoUnkeyedLiterals
66
67	Size int
68}
69
70// MarshalInput is input to the Marshal method.
71type MarshalInput = struct {
72	pragma.NoUnkeyedLiterals
73
74	Message protoreflect.Message
75	Buf     []byte // output is appended to this buffer
76	Flags   MarshalInputFlags
77}
78
79// MarshalOutput is output from the Marshal method.
80type MarshalOutput = struct {
81	pragma.NoUnkeyedLiterals
82
83	Buf []byte // contains marshaled message
84}
85
86// MarshalInputFlags configure the marshaler.
87// Most flags correspond to fields in proto.MarshalOptions.
88type MarshalInputFlags = uint8
89
90const (
91	MarshalDeterministic MarshalInputFlags = 1 << iota
92	MarshalUseCachedSize
93)
94
95// UnmarshalInput is input to the Unmarshal method.
96type UnmarshalInput = struct {
97	pragma.NoUnkeyedLiterals
98
99	Message  protoreflect.Message
100	Buf      []byte // input buffer
101	Flags    UnmarshalInputFlags
102	Resolver interface {
103		FindExtensionByName(field protoreflect.FullName) (protoreflect.ExtensionType, error)
104		FindExtensionByNumber(message protoreflect.FullName, field protoreflect.FieldNumber) (protoreflect.ExtensionType, error)
105	}
106	Depth int
107}
108
109// UnmarshalOutput is output from the Unmarshal method.
110type UnmarshalOutput = struct {
111	pragma.NoUnkeyedLiterals
112
113	Flags UnmarshalOutputFlags
114}
115
116// UnmarshalInputFlags configure the unmarshaler.
117// Most flags correspond to fields in proto.UnmarshalOptions.
118type UnmarshalInputFlags = uint8
119
120const (
121	UnmarshalDiscardUnknown UnmarshalInputFlags = 1 << iota
122)
123
124// UnmarshalOutputFlags are output from the Unmarshal method.
125type UnmarshalOutputFlags = uint8
126
127const (
128	// UnmarshalInitialized may be set on return if all required fields are known to be set.
129	// If unset, then it does not necessarily indicate that the message is uninitialized,
130	// only that its status could not be confirmed.
131	UnmarshalInitialized UnmarshalOutputFlags = 1 << iota
132)
133
134// MergeInput is input to the Merge method.
135type MergeInput = struct {
136	pragma.NoUnkeyedLiterals
137
138	Source      protoreflect.Message
139	Destination protoreflect.Message
140}
141
142// MergeOutput is output from the Merge method.
143type MergeOutput = struct {
144	pragma.NoUnkeyedLiterals
145
146	Flags MergeOutputFlags
147}
148
149// MergeOutputFlags are output from the Merge method.
150type MergeOutputFlags = uint8
151
152const (
153	// MergeComplete reports whether the merge was performed.
154	// If unset, the merger must have made no changes to the destination.
155	MergeComplete MergeOutputFlags = 1 << iota
156)
157
158// CheckInitializedInput is input to the CheckInitialized method.
159type CheckInitializedInput = struct {
160	pragma.NoUnkeyedLiterals
161
162	Message protoreflect.Message
163}
164
165// CheckInitializedOutput is output from the CheckInitialized method.
166type CheckInitializedOutput = struct {
167	pragma.NoUnkeyedLiterals
168}
169