static functions associated with enums
Ali Çehreli
acehreli at yahoo.com
Thu Mar 21 16:39:33 PDT 2013
On 03/21/2013 01:34 PM, Dan wrote:
> Json serializeToJson(T)(T value) {
> ...
> static if( __traits(compiles, value = T.fromJson(value.toJson())) ){
It looks like fromJson must be a static member function because the
condition is written in a way that fromJson is called on the type
itself. (I don't know any trick to bind that to a regular function.)
It may not be suitable in your case but wrapping the enum inside a
struct is a solution (struct AssetCategory below):
import std.stdio;
import std.conv;
struct Json
{
string s;
this(string s) {
writefln("constructing with %s", s);
this.s = s;
}
T opCast(T : string)() const
{
return s;
}
}
Json serializeToJson(T)(T value) {
static if( __traits(compiles, value = T.fromJson(value.toJson())) )
{
return value.toJson();
} else {
return Json("NOT GOOD: DEFAULT BEHAVIOR");
}
}
enum AssetCategoryType {
Investment,
PrimaryResidence,
FamilyProperty,
FinancialInstrument
}
struct AssetCategory
{
AssetCategoryType assetType;
alias assetType this;
static AssetCategory fromJson(Json src) {
string value = cast(string)src;
return AssetCategory(value.to!AssetCategoryType);
}
}
static Json toJson(AssetCategory assetType) {
auto result = Json();
result = Json(text(assetType));
return result;
}
void main()
{
auto category = AssetCategory(AssetCategoryType.FamilyProperty);
auto json = serializeToJson(category);
writeln(json);
// Test fromJson
assert(AssetCategory.fromJson(Json("PrimaryResidence")) ==
AssetCategory(AssetCategoryType.PrimaryResidence));
}
Ali
More information about the Digitalmars-d-learn
mailing list