xref: /aosp_15_r20/external/golang-protobuf/proto/reset.go (revision 1c12ee1efe575feb122dbf939ff15148a3b3e8f2)
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 Willemsenpackage proto
6*1c12ee1eSDan Willemsen
7*1c12ee1eSDan Willemsenimport (
8*1c12ee1eSDan Willemsen	"fmt"
9*1c12ee1eSDan Willemsen
10*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/reflect/protoreflect"
11*1c12ee1eSDan Willemsen)
12*1c12ee1eSDan Willemsen
13*1c12ee1eSDan Willemsen// Reset clears every field in the message.
14*1c12ee1eSDan Willemsen// The resulting message shares no observable memory with its previous state
15*1c12ee1eSDan Willemsen// other than the memory for the message itself.
16*1c12ee1eSDan Willemsenfunc Reset(m Message) {
17*1c12ee1eSDan Willemsen	if mr, ok := m.(interface{ Reset() }); ok && hasProtoMethods {
18*1c12ee1eSDan Willemsen		mr.Reset()
19*1c12ee1eSDan Willemsen		return
20*1c12ee1eSDan Willemsen	}
21*1c12ee1eSDan Willemsen	resetMessage(m.ProtoReflect())
22*1c12ee1eSDan Willemsen}
23*1c12ee1eSDan Willemsen
24*1c12ee1eSDan Willemsenfunc resetMessage(m protoreflect.Message) {
25*1c12ee1eSDan Willemsen	if !m.IsValid() {
26*1c12ee1eSDan Willemsen		panic(fmt.Sprintf("cannot reset invalid %v message", m.Descriptor().FullName()))
27*1c12ee1eSDan Willemsen	}
28*1c12ee1eSDan Willemsen
29*1c12ee1eSDan Willemsen	// Clear all known fields.
30*1c12ee1eSDan Willemsen	fds := m.Descriptor().Fields()
31*1c12ee1eSDan Willemsen	for i := 0; i < fds.Len(); i++ {
32*1c12ee1eSDan Willemsen		m.Clear(fds.Get(i))
33*1c12ee1eSDan Willemsen	}
34*1c12ee1eSDan Willemsen
35*1c12ee1eSDan Willemsen	// Clear extension fields.
36*1c12ee1eSDan Willemsen	m.Range(func(fd protoreflect.FieldDescriptor, _ protoreflect.Value) bool {
37*1c12ee1eSDan Willemsen		m.Clear(fd)
38*1c12ee1eSDan Willemsen		return true
39*1c12ee1eSDan Willemsen	})
40*1c12ee1eSDan Willemsen
41*1c12ee1eSDan Willemsen	// Clear unknown fields.
42*1c12ee1eSDan Willemsen	m.SetUnknown(nil)
43*1c12ee1eSDan Willemsen}
44