@Override
    public List<OptionElement> getOptions(DescriptorProtos.FileDescriptorProto source) {
        List<OptionElement> options = new ArrayList<>();
        DescriptorProtos.FileOptions fileOptions = source.getOptions();

        // Java related options
        addOptionIfPresent(options, ProtoConstants.JAVA_PACKAGE_OPTION, fileOptions.hasJavaPackage(), fileOptions.getJavaPackage());
        addOptionIfPresent(options, ProtoConstants.JAVA_OUTER_CLASSNAME_OPTION, fileOptions.hasJavaOuterClassname(), fileOptions.getJavaOuterClassname());
        addOptionIfPresent(options, ProtoConstants.JAVA_MULTIPLE_FILES_OPTION, fileOptions.hasJavaMultipleFiles(), fileOptions.getJavaMultipleFiles());
        addOptionIfPresent(options, ProtoConstants.JAVA_GENERATE_EQUALS_AND_HASH_OPTION, fileOptions.hasJavaGenerateEqualsAndHash(), fileOptions.getJavaGenerateEqualsAndHash());
        addOptionIfPresent(options, ProtoConstants.JAVA_GENERIC_SERVICES_OPTION, fileOptions.hasJavaGenericServices(), fileOptions.getJavaGenericServices());
        addOptionIfPresent(options, ProtoConstants.JAVA_STRING_CHECK_UTF8_OPTION, fileOptions.hasJavaStringCheckUtf8(), fileOptions.getJavaStringCheckUtf8());

        // C++ related options
        addOptionIfPresent(options, ProtoConstants.CC_GENERIC_SERVICES_OPTION, fileOptions.hasCcGenericServices(), fileOptions.getCcGenericServices());
        addOptionIfPresent(options, ProtoConstants.CC_ENABLE_ARENAS_OPTION, fileOptions.hasCcEnableArenas(), fileOptions.getCcEnableArenas());

        // C# related options
        addOptionIfPresent(options, ProtoConstants.CSHARP_NAMESPACE_OPTION, fileOptions.hasCsharpNamespace(), fileOptions.getCsharpNamespace());

        // Go related options
        addOptionIfPresent(options, ProtoConstants.GO_PACKAGE_OPTION, fileOptions.hasGoPackage(), fileOptions.getGoPackage());

        // Objective-C related options
        addOptionIfPresent(options, ProtoConstants.OBJC_CLASS_PREFIX_OPTION, fileOptions.hasObjcClassPrefix(), fileOptions.getObjcClassPrefix());

        // PHP related options
        addOptionIfPresent(options, ProtoConstants.PHP_CLASS_PREFIX_OPTION, fileOptions.hasPhpClassPrefix(), fileOptions.getPhpClassPrefix());
//        addOptionIfPresent(options, ProtoConstants.PHP_GENERIC_SERVICES_OPTION, fileOptions.hasPhpGenericServices(), fileOptions.getPhpGenericServices());
        addOptionIfPresent(options, ProtoConstants.PHP_METADATA_NAMESPACE_OPTION, fileOptions.hasPhpMetadataNamespace(), fileOptions.getPhpMetadataNamespace());
        addOptionIfPresent(options, ProtoConstants.PHP_NAMESPACE_OPTION, fileOptions.hasPhpNamespace(), fileOptions.getPhpNamespace());

        // Python related options
        addOptionIfPresent(options, ProtoConstants.PY_GENERIC_SERVICES_OPTION, fileOptions.hasPyGenericServices(), fileOptions.getPyGenericServices());

        // Ruby related options
        addOptionIfPresent(options, ProtoConstants.RUBY_PACKAGE_OPTION, fileOptions.hasRubyPackage(), fileOptions.getRubyPackage());

        // Swift related options
        addOptionIfPresent(options, ProtoConstants.SWIFT_PREFIX_OPTION, fileOptions.hasSwiftPrefix(), fileOptions.getSwiftPrefix());

        // Optimize related options
        addOptionIfPresent(options, ProtoConstants.OPTIMIZE_FOR_OPTION, fileOptions.hasOptimizeFor(), fileOptions.getOptimizeFor());

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