#pragma once

CLASS(DataSource, Object)
    STATIC_ATTRIB(DataSource, true, entity, NEW(Object));
    STATIC_ATTRIB(DataSource, false, entity, NULL);
    /**
     * get entry `i` passing `name` and `icon` through `returns` if it is not null
     * returns `DataSource_false` if out of bounds
     * otherwise returns an entity or `DataSource_true`
     */
    METHOD(DataSource, getEntry, entity(entity this, int i, void(string name, string icon) returns)) { return DataSource_false; }
    /** return the index of the first match for `find`. optional */
    METHOD(DataSource, indexOf, int(entity this, string find)) { return -1; }
    /** reload all entries matching `filter` returning how many matches were found */
    METHOD(DataSource, reload, int(entity this, string filter)) { return 0; }
    /** cleanup on shutdown. optional */
    METHOD(DataSource, destroy, void(entity this)) { }
ENDCLASS(DataSource)


CLASS(StringSource, DataSource)
    ATTRIB(StringSource, StringSource_str, string);
    ATTRIB(StringSource, StringSource_sep, string);
    CONSTRUCTOR(StringSource, string str, string sep);
    METHOD(StringSource, getEntry, entity(entity this, int i, void(string name, string icon) returns));
    METHOD(StringSource, reload, int(entity this, string filter));
ENDCLASS(StringSource)

CLASS(CvarStringSource, StringSource)
    ATTRIB(CvarStringSource, CvarStringSource_cvar, string);
    CONSTRUCTOR(CvarStringSource, string cv, string sep);
    METHOD(CvarStringSource, getEntry, entity(entity this, int i, void(string name, string icon) returns));
    METHOD(CvarStringSource, reload, int(entity this, string filter));
ENDCLASS(CvarStringSource)
