diff options
Diffstat (limited to 'debInfo.go')
| -rw-r--r-- | debInfo.go | 59 |
1 files changed, 59 insertions, 0 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 +} |
