// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_PLUGIN_REGISTRY_H_
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_PLUGIN_REGISTRY_H_

#if !defined(__FLUTTER_LINUX_INSIDE__) && !defined(FLUTTER_LINUX_COMPILATION)
#error "Only <flutter_linux/flutter_linux.h> can be included directly."
#endif

#include <glib-object.h>

#include "fl_plugin_registrar.h"

G_BEGIN_DECLS

G_DECLARE_INTERFACE(FlPluginRegistry,
                    fl_plugin_registry,
                    FL,
                    PLUGIN_REGISTRY,
                    GObject)

/**
 * FlPluginRegistry:
 *
 * #FlPluginRegistry vends #FlPluginRegistrar objects for named plugins.
 */

struct _FlPluginRegistryInterface {
  GTypeInterface g_iface;

  /**
   * FlPluginRegistry::get_registrar_for_plugin:
   * @registry: an #FlPluginRegistry.
   * @name: plugin name.
   *
   * Gets the plugin registrar for the the plugin with @name.
   *
   * Returns: (transfer full): an #FlPluginRegistrar.
   */
  FlPluginRegistrar* (*get_registrar_for_plugin)(FlPluginRegistry* registry,
                                                 const gchar* name);
};

/**
 * fl_plugin_registry_get_registrar_for_plugin:
 * @registry: an #FlPluginRegistry.
 * @name: plugin name.
 *
 * Gets the plugin registrar for the the plugin with @name.
 *
 * Returns: (transfer full): an #FlPluginRegistrar.
 */
FlPluginRegistrar* fl_plugin_registry_get_registrar_for_plugin(
    FlPluginRegistry* registry,
    const gchar* name);

G_END_DECLS

#endif  // FLUTTER_SHELL_PLATFORM_LINUX_FL_PLUGIN_REGISTRY_H_
