Created
March 25, 2014 13:54
-
-
Save 3Hren/dab2b08a472cc1a3f09c to your computer and use it in GitHub Desktop.
Half-compile-time attribute extractor.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
mixin template UriBasedRequest(T) { | |
public string uri() @property const { | |
UriBuilder builder = new UriBuilder(); | |
string[] paths; | |
foreach (memberName; __traits(allMembers, T)) { | |
// TODO: Iterate only over fields. | |
alias Member = TypeTuple!(__traits(getMember, this, memberName))[0]; | |
alias MemberType = typeof(Member); | |
alias Attributes = TypeTuple!(__traits(getAttributes, Member)); | |
static if (Attributes.length > 0) { | |
static if (hasAttribute!(Member, PathAttribute)) { | |
static if (isArray!(MemberType)) { | |
// aggregate | |
// assign | |
} else static if (is(Unqual!(MemberType) : string)) { | |
string value = to!string(Member); | |
if (value.length == 0) { | |
static if (hasAttribute!(Member, QueryAttribute)) { | |
paths ~= getAttribute!(Member, DefaultAttribute).value; | |
} | |
} else { | |
paths ~= value; | |
} | |
}/+ else static if (isNullable!(typeof(Member))) { | |
if (value.isNull) { | |
static if (hasAttribute!(Member, QueryAttribute)) { | |
paths ~= getAttribute!(Member, DefaultAttribute).value; | |
} | |
} else { | |
paths ~= value; | |
} | |
}+/ | |
} else static if (hasAttribute!(Member, QueryAttribute)) { | |
enum name = getAttribute!(Member, QueryAttribute).name; | |
static if (name.length == 0) { | |
enum queryName = memberName; | |
} else { | |
enum queryName = name; | |
} | |
alias queryValue = Member; | |
builder.addParameter(queryName, queryValue); | |
} | |
} | |
} | |
builder.setPath(paths); | |
(cast(const T)(this)).buildUri(builder); | |
return builder.uri; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment