1 module dpq2.conv.from_d_types;
2 
3 @safe:
4 
5 import dpq2;
6 import std.bitmanip: nativeToBigEndian;
7 import std.traits: isNumeric;
8 
9 Value toValue(T)(T v)
10 if(isNumeric!(T))
11 {
12     return Value(v.nativeToBigEndian.dup, detectOidTypeFromNative!T, false, ValueFormat.BINARY);
13 }
14 
15 Value toValue(T)(T v, ValueFormat valueFormat = ValueFormat.BINARY) @trusted
16 if(is(T == string))
17 {
18     if(valueFormat == ValueFormat.TEXT) v = v~'\0'; // for prepareArgs only
19 
20     ubyte[] buf = cast(ubyte[]) v;
21 
22     return Value(buf, detectOidTypeFromNative!T, false, valueFormat);
23 }
24 
25 Value toValue(T)(T v)
26 if(is(T == ubyte[]))
27 {
28     return Value(v, detectOidTypeFromNative!T, false, ValueFormat.BINARY);
29 }
30 
31 Value toValue(T : bool)(T v) @trusted
32 {
33     ubyte[] buf;
34     buf.length = 1;
35     buf[0] = (v ? 1 : 0);
36 
37     return Value(buf, detectOidTypeFromNative!T, false, ValueFormat.BINARY);
38 }
39 
40 unittest
41 {
42     {
43         Value v = toValue(cast(short) 123);
44 
45         assert(v.oidType == OidType.Int2);
46         assert(v.as!short == 123);
47     }
48 
49     {
50         Value v = toValue(-123.456);
51 
52         assert(v.oidType == OidType.Float8);
53         assert(v.as!double == -123.456);
54     }
55 
56     {
57         Value v = toValue("Test string");
58 
59         assert(v.oidType == OidType.Text);
60         assert(v.as!string == "Test string");
61     }
62 
63     {
64         ubyte[] buf = [0, 1, 2, 3, 4, 5];
65         Value v = toValue(buf.dup);
66 
67         assert(v.oidType == OidType.ByteArray);
68         assert(v.as!(const ubyte[]) == buf);
69     }
70 
71     {
72         Value t = toValue(true);
73         Value f = toValue(false);
74 
75         assert(t.as!bool == true);
76         assert(f.as!bool == false);
77     }
78 }