1 
2 module dquery.d;
3 
4 import std.traits;
5 import std.typetuple;
6 
7 public import dquery.attribute;
8 public import dquery.attributes;
9 public import dquery.element;
10 public import dquery.helper;
11 public import dquery.overload;
12 public import dquery.query;
13 
14 /++
15  + Produces a query over the given type.
16  +
17  + Returns:
18  +     A query over the supplied type.
19  ++/
20 auto query(QueryType, bool Safe = false)()
21 {
22 	template MapToElement(string Name)
23 	{
24 		// Check for functions; each overload is kept as an element.
25 		static if(is(typeof(GetMember!(QueryType, Name)) == function))
26 		{
27 			alias MapToOverload(alias Overload) = Alias!(
28 				DQueryElement!(
29 					QueryType, Name, DQueryOverload!(
30 						arity!Overload, ReturnType!Overload, ParameterTypeTuple!Overload
31 					)()
32 				)()
33 			);
34 
35 			alias MapToElement = staticMap!(
36 				MapToOverload, __traits(getOverloads, QueryType, Name)
37 			);
38 		}
39 		// Normal members.
40 		else
41 		{
42 			alias MapToElement = Alias!(DQueryElement!(QueryType, Name)());
43 		}
44 	}
45 
46 	template SafeMap(string Name)
47 	{
48 		static if(__traits(compiles, MapToElement!Name) || Safe)
49 		{
50 			alias SafeMap = MapToElement!Name;
51 		}
52 		else
53 		{
54 			alias SafeMap = TypeTuple!();
55 		}
56 	}
57 
58 	enum Elements = __traits(allMembers, QueryType);
59 	return DQuery!(QueryType, staticMap!(SafeMap, Elements))();
60 }
61 
62 /++
63  + Produces a query over the type of the supplied parameter.
64  +
65  + Params:
66  +     value = A parameter to type query.
67  +
68  + Returns:
69  +     A query over the parameter's type.
70  ++/
71 auto query(QueryType)(QueryType value)
72 {
73 	return query!QueryType;
74 }