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