/* * Create JSON-RPC request in a given buffer. * * Return length of the request, which * can be larger then `len` that indicates an overflow. */ int ns_rpc_create_request(char *buf, int len, const char *method, const char *id, const char *params_fmt, ...) { va_list ap; int n = 0; n += json_emit(buf + n, len - n, "{s:s,s:s,s:s,s:", "jsonrpc", "2.0", "id", id, "method", method, "params"); va_start(ap, params_fmt); n += json_emit_va(buf + n, len - n, params_fmt, ap); va_end(ap); n += json_emit(buf + n, len - n, "}"); return n; }
/* * Create JSON-RPC error reply in a given buffer. * * Return length of the error, which * can be larger then `len` that indicates an overflow. */ int ns_rpc_create_error(char *buf, int len, struct ns_rpc_request *req, int code, const char *message, const char *fmt, ...) { va_list ap; int n = 0; n += json_emit(buf + n, len - n, "{s:s,s:V,s:{s:i,s:s,s:", "jsonrpc", "2.0", "id", req->id == NULL ? "null" : req->id->ptr, req->id == NULL ? 4 : req->id->len, "error", "code", code, "message", message, "data"); va_start(ap, fmt); n += json_emit_va(buf + n, len - n, fmt, ap); va_end(ap); n += json_emit(buf + n, len - n, "}}"); return n; }
int ns_rpc_create_reply(char *buf, int len, const struct ns_rpc_request *req, const char *result_fmt, ...) { va_list ap; int n = 0; n += json_emit(buf + n, len - n, "{s:s,s:V,s:", "jsonrpc", "2.0", "id", req->id == NULL ? "null" : req->id->ptr, req->id == NULL ? 4 : req->id->len, "result"); va_start(ap, result_fmt); n += json_emit_va(buf + n, len - n, result_fmt, ap); va_end(ap); n += json_emit(buf + n, len - n, "}"); return n; }
/* * Create JSON-RPC reply in a given buffer. * * Return length of the reply, which * can be larger then `len` that indicates an overflow. */ int ns_rpc_create_reply(char *buf, int len, const struct ns_rpc_request *req, const char *result_fmt, ...) { static const struct json_token null_tok = {"null", 4, 0, JSON_TYPE_NULL}; const struct json_token *id = req->id == NULL ? &null_tok : req->id; va_list ap; int n = 0; n += json_emit(buf + n, len - n, "{s:s,s:", "jsonrpc", "2.0", "id"); if (id->type == JSON_TYPE_STRING) { n += json_emit_quoted_str(buf + n, len - n, id->ptr, id->len); } else { n += json_emit_unquoted_str(buf + n, len - n, id->ptr, id->len); } n += json_emit(buf + n, len - n, ",s:", "result"); va_start(ap, result_fmt); n += json_emit_va(buf + n, len - n, result_fmt, ap); va_end(ap); n += json_emit(buf + n, len - n, "}"); return n; }