#include <glib.h>
#include <glib-object.h>

#ifndef BD_PLUGINS
#define BD_PLUGINS

typedef enum {
    BD_PLUGIN_LVM = 0,
    BD_PLUGIN_BTRFS,
    BD_PLUGIN_SWAP,
    BD_PLUGIN_LOOP,
    BD_PLUGIN_CRYPTO,
    BD_PLUGIN_MPATH,
    BD_PLUGIN_DM,
    BD_PLUGIN_MDRAID,
    BD_PLUGIN_S390,
    BD_PLUGIN_PART,
    BD_PLUGIN_FS,
    BD_PLUGIN_NVDIMM,
    BD_PLUGIN_NVME,
    BD_PLUGIN_SMART,
    BD_PLUGIN_UNDEF
} BDPlugin;

#define BD_TYPE_PLUGIN_SPEC (bd_plugin_spec_get_type ())
GType bd_plugin_spec_get_type(void);

/**
 * BDPluginSpec:
 * @name: %BDPlugin name, e.g. %BD_PLUGIN_LVM
 * @so_name: (nullable): SO name of the plugin to load or %NULL for default
 *
 */
typedef struct BDPluginSpec {
    BDPlugin name;
    const gchar *so_name;
} BDPluginSpec;

BDPluginSpec* bd_plugin_spec_copy (BDPluginSpec *spec);
void bd_plugin_spec_free (BDPluginSpec *spec);
BDPluginSpec* bd_plugin_spec_new (BDPlugin name, const gchar *so_name);

gboolean bd_is_plugin_available (BDPlugin plugin);
gchar** bd_get_available_plugin_names (void);
gchar* bd_get_plugin_soname (BDPlugin plugin);
gchar* bd_get_plugin_name (BDPlugin plugin);

#endif  /* BD_PLUGINS */