keyword as struct field

Basile B. b2.temp at gmx.com
Sun Feb 20 14:00:45 UTC 2022


On Sunday, 20 February 2022 at 11:08:55 UTC, partypooper wrote:
> Hello, I'm new to D.
>
> Title is self described, is it possible to use keyword as 
> struct field?
>
> Maybe it is XYproblem, so here I will describe a little what I 
> need.
> I'm parsing some json currently with 
> [mir-ion](https://code.dlang.org/packages/mir-ion) 
> (better/simpler suggestions for only json de/serialization?), 
> that has "version" as one of it's keys, so I can't use that as 
> field in my struct. Maybe some annotation in mir library to 
> parse "version" into other struct field name, can't find though 
> (its docs pretty concise).

I have a library solution based on opDispatch + 
__traits(getMember):

```d
/**
  * Mixin template allowing to use a field as if its identifier is 
a D keyword.
  * Note that this only works with `__traits(getMember)`.
  * Params:
  *      keywordFieldPairs = An array of keyword and field pairs.
  */
template FieldOfKeyword(string[2][] keywordFieldPairs)
{
     template opDispatch(string member)
     {
         static foreach (pair; keywordFieldPairs)
             static if (member == pair[0])
                 mixin("alias opDispatch = ", pair[1], ";" );
     }
}
///
unittest
{
     struct Foo
     {
         mixin FieldOfKeyword!([["scope", "scope_"],["class", 
"class_"]]);
         string scope_;
         string class_;
     }

     Foo foo;
     __traits(getMember, foo, "scope") = "The Universe";
     assert(__traits(getMember, foo, "scope") == "The Universe");
     __traits(getMember, foo, "class") = "Atom";
     assert(__traits(getMember, foo, "class") == "Atom");
}
```

never used it TBH.


More information about the Digitalmars-d-learn mailing list