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