Skip to content

Instantly share code, notes, and snippets.

@3Hren
Created March 25, 2014 13:54
Show Gist options
  • Save 3Hren/dab2b08a472cc1a3f09c to your computer and use it in GitHub Desktop.
Save 3Hren/dab2b08a472cc1a3f09c to your computer and use it in GitHub Desktop.
Half-compile-time attribute extractor.
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