summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--debInfo.go59
-rw-r--r--populatePackagePB.go51
2 files changed, 59 insertions, 51 deletions
diff --git a/debInfo.go b/debInfo.go
new file mode 100644
index 0000000..98d0439
--- /dev/null
+++ b/debInfo.go
@@ -0,0 +1,59 @@
+package debian
+
+import (
+ "errors"
+ "fmt"
+
+ "google.golang.org/protobuf/proto"
+ "google.golang.org/protobuf/reflect/protoreflect"
+
+ "go.wit.com/lib/config"
+)
+
+func SetDebInfoString(pb proto.Message, varname string, varvalue string) error {
+ // 1. Get the reflection interface for the top-level message (e.g., Package).
+ msg := pb.ProtoReflect()
+ descriptor := msg.Descriptor()
+
+ // 2. Find the FieldDescriptor for the nested message field (named "debInfo").
+ // This is the corrected line: call .Fields().ByName().
+ debInfoFieldDescriptor := descriptor.Fields().ByName("debInfo")
+ if debInfoFieldDescriptor == nil {
+ return fmt.Errorf("field 'debInfo' not found in message %s", descriptor.FullName())
+ }
+
+ // 3. From the field descriptor, get the MessageDescriptor for the DebInfo type.
+ // This gives us the "schema" for the DebInfo message.
+ debInfoMsgDescriptor := debInfoFieldDescriptor.Message()
+ if debInfoMsgDescriptor == nil {
+ // This would happen if the 'debInfo' field was not a message type.
+ // return ErrFieldNotMessage
+ return errors.New("debInfo failed to turn into a message?")
+ }
+
+ // 4. Now, find the FieldDescriptor for the target string field (varname)
+ // WITHIN the DebInfo message's schema.
+ fieldName := protoreflect.Name(varname)
+ fieldDescriptor := debInfoMsgDescriptor.Fields().ByName(fieldName)
+ if fieldDescriptor == nil {
+ return fmt.Errorf("field '%s' not found in nested message 'debInfo'", varname)
+ }
+
+ // 5. Validate that the target field is a string.
+ if fieldDescriptor.Kind() != protoreflect.StringKind {
+ return config.ErrProtoVarNotString
+ }
+
+ // 6. CRITICAL STEP: Get a mutable reference to the actual nested DebInfo message.
+ // msg.Mutable() is perfect for this. It will:
+ // a) Get the existing DebInfo message if it's already been set.
+ // b) Create a NEW, empty DebInfo message if it's currently nil.
+ // Then, we get the reflection interface for that nested message.
+ debInfoMsg := msg.Mutable(debInfoFieldDescriptor).Message()
+
+ // 7. Prepare the value and SET it on the nested message.
+ valueToSet := protoreflect.ValueOfString(varvalue)
+ debInfoMsg.Set(fieldDescriptor, valueToSet)
+
+ return nil
+}
diff --git a/populatePackagePB.go b/populatePackagePB.go
index 34127a4..78eb6a3 100644
--- a/populatePackagePB.go
+++ b/populatePackagePB.go
@@ -1,9 +1,6 @@
package debian
import (
- "errors"
- "fmt"
-
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/reflect/protoreflect"
@@ -37,54 +34,6 @@ func SetString(pb proto.Message, varname string, varvalue string) (bool, error)
return true, nil
}
-func SetDebInfoString(pb proto.Message, varname string, varvalue string) error {
- // 1. Get the reflection interface for the top-level message (e.g., Package).
- msg := pb.ProtoReflect()
- descriptor := msg.Descriptor()
-
- // 2. Find the FieldDescriptor for the nested message field (named "debInfo").
- // This is the corrected line: call .Fields().ByName().
- debInfoFieldDescriptor := descriptor.Fields().ByName("debInfo")
- if debInfoFieldDescriptor == nil {
- return fmt.Errorf("field 'debInfo' not found in message %s", descriptor.FullName())
- }
-
- // 3. From the field descriptor, get the MessageDescriptor for the DebInfo type.
- // This gives us the "schema" for the DebInfo message.
- debInfoMsgDescriptor := debInfoFieldDescriptor.Message()
- if debInfoMsgDescriptor == nil {
- // This would happen if the 'debInfo' field was not a message type.
- // return ErrFieldNotMessage
- return errors.New("debInfo failed to turn into a message?")
- }
-
- // 4. Now, find the FieldDescriptor for the target string field (varname)
- // WITHIN the DebInfo message's schema.
- fieldName := protoreflect.Name(varname)
- fieldDescriptor := debInfoMsgDescriptor.Fields().ByName(fieldName)
- if fieldDescriptor == nil {
- return fmt.Errorf("field '%s' not found in nested message 'debInfo'", varname)
- }
-
- // 5. Validate that the target field is a string.
- if fieldDescriptor.Kind() != protoreflect.StringKind {
- return config.ErrProtoVarNotString
- }
-
- // 6. CRITICAL STEP: Get a mutable reference to the actual nested DebInfo message.
- // msg.Mutable() is perfect for this. It will:
- // a) Get the existing DebInfo message if it's already been set.
- // b) Create a NEW, empty DebInfo message if it's currently nil.
- // Then, we get the reflection interface for that nested message.
- debInfoMsg := msg.Mutable(debInfoFieldDescriptor).Message()
-
- // 7. Prepare the value and SET it on the nested message.
- valueToSet := protoreflect.ValueOfString(varvalue)
- debInfoMsg.Set(fieldDescriptor, valueToSet)
-
- return nil
-}
-
/*
msg := pb.ProtoReflect() // This is the entry point to the reflection API.