1 module mars.protosub;
2 
3 import std.variant;
4 import std.experimental.logger;
5 import vibe.data.json;
6 
7 import mars.client;
8 import mars.msg;
9 
10 
11 
12  
13 void protoSubscribe(S)(MarsClient* client, S socket) {
14     auto state = RequestState.executed;
15 
16 
17     auto req = socket.binaryAs!SubscribeReq;
18     // XXX handle wrong parameters
19     //if( req.tableIndex < 0 || req.tableIndex > marsServer.tables.length ){
20     //    state = RequestState.rejectedAsWrongParameter;
21     //}
22 
23     infof("===> %s ", req.select, req.parameters);
24 
25     // ... let's put the parameters that are inside the json in a variant AA
26     //     in that way we are isolating the encoding, vibe json, from the rest ...
27     Variant[string] parameters;
28     if(req.parameters){
29         auto json = parseJsonString(req.parameters);
30         foreach (string name, value; json){
31             if( value.type == Json.Type..string ){ parameters[name] = value.get!string; }
32             // ... vibe doc says Json int is a '64bit integer value'
33             else if(value.type == Json.Type.int_){ parameters[name] = value.get!long.to!int; } 
34             else if(value.type == Json.Type.bool_){ parameters[name] = value.get!bool; }
35 
36             else if(value.type == Json.Type.null_){
37                 state = RequestState.rejectedAsWrongParameter;
38                 errorf("mars - C ... S - something wrong with query parameter, null json data type");
39             }
40             else assert(false, value.type.to!string); // XXX reply back error
41         }
42     }
43 
44     string stringified = "[]";
45     if( state == state.init ){ // XXX 
46         auto json = client.vueSubscribe(req.select, parameters, state);
47         stringified = json.toString();
48     }
49 
50     final switch(state) with(RequestState){
51         case rejectedAsWrongParameter:
52         case internalServerError:
53         case rejectedAsDecodingFailed:
54         case rejectedAsNotAuthorised:
55         case rejectedAsPGSqlError:
56             socket.sendReply(req, SubscribeRep(state, stringified));
57             break;
58         case executed:
59             socket.sendReply(req, SubscribeRep(state, stringified));
60             break;
61     }
62 
63 }