1 module requests.utils;
2 
3 import std.range;
4 
5 static immutable short[string] standard_ports;
6 static this() {
7     standard_ports["http"] = 80;
8     standard_ports["https"] = 443;
9     standard_ports["ftp"] = 21;
10 }
11 
12 
13 auto getter(string name) {
14     return `
15         @property final auto ` ~ name ~ `() const @safe @nogc {
16             return __` ~ name ~ `;
17         }
18     `;
19 }
20 auto setter(string name) {
21     string member = "__" ~ name;
22     string t = "typeof(this."~member~")";
23     return `
24         @property final void ` ~ name ~`(` ~ t ~ ` s) pure @nogc nothrow {`~ 
25              member ~`=s;
26         }
27     `;
28 }
29 
30 unittest {
31     struct S {
32         private {
33             int    __i;
34             string __s;
35             bool   __b;
36         }
37         mixin(getter("i"));
38         mixin(setter("i"));
39         mixin(getter("b"));
40     }
41     S s;
42     assert(s.i == 0);
43     s.i = 1;
44     assert(s.i == 1);
45     assert(s.b == false);
46 }
47 
48 template rank(R) {
49     static if ( isInputRange!R ) {
50         enum size_t rank = 1 + rank!(ElementType!R);
51     } else {
52         enum size_t rank = 0;
53     }
54 }
55 unittest {
56     assert(rank!(char) == 0);
57     assert(rank!(string) == 1);
58     assert(rank!(ubyte[][]) == 2);
59 }
60