Thomas
Thomas

Reputation: 68

Vala, string to enum

Is there a way to convert a string to an enum in vala:

string foo = "Enum1";
MY_ENUM theEnum = MY_ENUM.get_value_by_name(foo);
enum MY_ENUM {
    Enum1,
    Enum2,
    Enum3
}

So in this example "theEnum" would have the value: MY_ENUM.Enum1

Upvotes: 1

Views: 354

Answers (1)

AlThomas
AlThomas

Reputation: 4289

It is possible using the runtime type system provided by GLib's GObject library. There are EnumClass and EnumValue. These provide introspection at runtime and allow an enum to be initialised from a string.

The syntax is a bit complex at present, although it may be possible for someone to modify the Vala compiler to make it easier, but that is a significant piece of work.

An example:

void main () {
    try {
        MyEnum? the_enum_value;
        the_enum_value = MyEnum.parse ("FIRST");
        print (@"$(the_enum_value)\n");
    } catch (EnumError error) {
        print (@"$(error.message)\n");
    }
}

errordomain EnumError {
    UNKNOWN_VALUE
}

enum MyEnum {
    FIRST,
    SECOND,
    THIRD;

    public static MyEnum parse (string value) throws EnumError {
        EnumValue? a;
        a = ((EnumClass)typeof (MyEnum).class_ref ()).get_value_by_name ("MY_ENUM_" + value);
        if (a == null) {
            throw new EnumError.UNKNOWN_VALUE (@"String $(value) is not a valid value for $(typeof(MyEnum).name())");
        }
        return (MyEnum)a.value;
    }
}

Upvotes: 1

Related Questions