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 }