func lookup_field(msg *message.Message, fn string, fi int, ai int) (int, unsafe.Pointer, int) { var field *message.Field if fi != 0 { fields := msg.FindAllFields(fn) if fi >= len(fields) { return 0, unsafe.Pointer(nil), 0 } field = fields[fi] } else { if field = msg.FindFirstField(fn); field == nil { return 0, unsafe.Pointer(nil), 0 } } fieldType := int(field.GetValueType()) switch field.GetValueType() { case message.Field_STRING: if ai >= len(field.ValueString) { return fieldType, unsafe.Pointer(nil), 0 } value := field.ValueString[ai] cs := C.CString(value) // freed by the caller return fieldType, unsafe.Pointer(cs), len(value) case message.Field_BYTES: if ai >= len(field.ValueBytes) { return fieldType, unsafe.Pointer(nil), 0 } value := field.ValueBytes[ai] return fieldType, unsafe.Pointer(&field.ValueBytes[ai][0]), len(value) case message.Field_INTEGER: if ai >= len(field.ValueInteger) { return fieldType, unsafe.Pointer(nil), 0 } return fieldType, unsafe.Pointer(&field.ValueInteger[ai]), 0 case message.Field_DOUBLE: if ai >= len(field.ValueDouble) { return fieldType, unsafe.Pointer(nil), 0 } return fieldType, unsafe.Pointer(&field.ValueDouble[ai]), 0 case message.Field_BOOL: if ai >= len(field.ValueBool) { return fieldType, unsafe.Pointer(nil), 0 } return fieldType, unsafe.Pointer(&field.ValueBool[ai]), 0 } return 0, unsafe.Pointer(nil), 0 }
func getFieldAsString(msg *message.Message, mvar *messageVariable) string { var field *message.Field if mvar.fi != 0 { fields := msg.FindAllFields(mvar.name) if mvar.fi >= len(fields) { return "" } field = fields[mvar.fi] } else { if field = msg.FindFirstField(mvar.name); field == nil { return "" } } switch field.GetValueType() { case message.Field_STRING: if mvar.ai >= len(field.ValueString) { return "" } return field.ValueString[mvar.ai] case message.Field_BYTES: if mvar.ai >= len(field.ValueBytes) { return "" } return string(field.ValueBytes[mvar.ai]) case message.Field_INTEGER: if mvar.ai >= len(field.ValueInteger) { return "" } return fmt.Sprintf("%d", field.ValueInteger[mvar.ai]) case message.Field_DOUBLE: if mvar.ai >= len(field.ValueDouble) { return "" } return fmt.Sprintf("%g", field.ValueDouble[mvar.ai]) case message.Field_BOOL: if mvar.ai >= len(field.ValueBool) { return "" } return fmt.Sprintf("%t", field.ValueBool[mvar.ai]) } return "" }