summaryrefslogtreecommitdiff
path: root/findFilename.go
blob: d69b5385384361dbabb23d23beceb038d6217f25 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package config

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

// Gemini AI can help author some pretty good protobuf code.
// I never remember the syntax for 'reflect' on these things.

// returns "Filename" if it exists in the protobuf
func GetFilename(pb proto.Message) (string, bool) {
	// 1. Get the protoreflect.Message interface from the message.
	// This is the entry point to the reflection API.
	msg := pb.ProtoReflect()

	// 2. Get the message's descriptor, which contains metadata about its fields.
	descriptor := msg.Descriptor()

	// 3. Find the specific field descriptor by its protobuf name ("Filename").
	// Note: The field name must match the name in the .proto file.
	fieldName := protoreflect.Name("Filename")
	fieldDescriptor := descriptor.Fields().ByName(fieldName)

	// 4. Check if the field was found. If not, return false.
	if fieldDescriptor == nil {
		return "", false
	}

	// 5. (Optional but recommended) Verify the field is a string type.
	if fieldDescriptor.Kind() != protoreflect.StringKind {
		// The field exists but is not a string, so we can't return it as one.
		return "", false
	}

	// 6. If the field exists and is a string, get its value.
	// The value is returned as a protoreflect.Value.
	value := msg.Get(fieldDescriptor)

	// 7. Convert the protoreflect.Value to a native Go string.
	return value.String(), true
}

// sets "Filename" if it exists in the protobuf
func SetFilename(pb proto.Message, filename string) bool {
	msg := pb.ProtoReflect() // This is the entry point to the reflection API.

	descriptor := msg.Descriptor() // Get the message's descriptor, which contains metadata about its fields.

	fieldName := protoreflect.Name("Filename")
	fieldDescriptor := descriptor.Fields().ByName(fieldName)

	if fieldDescriptor == nil {
		return false
	}

	if fieldDescriptor.Kind() != protoreflect.StringKind {
		// The field exists but is not a string, so we can't return it as one.
		return false
	}

	valueToSet := protoreflect.ValueOfString(filename)

	// 6. If the field exists and is a string, get its value.
	// The value is returned as a protoreflect.Value.
	msg.Set(fieldDescriptor, valueToSet)

	// 7. Convert the protoreflect.Value to a native Go string.
	return true
}