private MessageElement convertMessage(DescriptorProtos.DescriptorProto descriptor,
        DescriptorProtos.FileDescriptorProto file) {
        MessageBuilder builder = new MessageBuilder(descriptor.getName());

        // Add options
        new MessageOptionStrategy().addOption(builder, descriptor.getOptions());

        // Process fields and oneofs
        Map<Integer, OneOfBuilder> oneofBuilders = new HashMap<>();
        for (DescriptorProtos.OneofDescriptorProto oneof : descriptor.getOneofDeclList()) {
            oneofBuilders.put(oneofBuilders.size(), builder.newOneOf(oneof.getName()));
        }

        // Process fields
        for (DescriptorProtos.FieldDescriptorProto field : descriptor.getFieldList()) {
            FieldElement fieldElement = convertField(file, field, field.hasOneofIndex());
            if (field.hasOneofIndex()) {
                oneofBuilders.get(field.getOneofIndex()).addField(fieldElement);
            } else {
                builder.addField(fieldElement);
            }
        }

        // Process nested types
        for (DescriptorProtos.DescriptorProto nestedType : descriptor.getNestedTypeList()) {
            builder.addNestedType(convertMessage(nestedType, file));
        }
        for (DescriptorProtos.EnumDescriptorProto enumType : descriptor.getEnumTypeList()) {
            builder.addNestedType(convertEnum(enumType));
        }

        // Process reserved ranges and names
        processReservedRanges(descriptor, builder);
        processExtensionRanges(descriptor, builder);

        return builder.build();
    }
Converter implementation for FileDescriptor to Wire Schema elements.
core/src/main/java/kafka/automq/table/deserializer/proto/parse/converter/FileDescriptorConverter.java