| 1 | /************************************************************************* |
|---|---|
| 2 | * libjson-rpc-cpp |
| 3 | ************************************************************************* |
| 4 | * @file specificationwriter.cpp |
| 5 | * @date 30.04.2013 |
| 6 | * @author Peter Spiess-Knafl <dev@spiessknafl.at> |
| 7 | * @license See attached LICENSE.txt |
| 8 | ************************************************************************/ |
| 9 | |
| 10 | #include "specificationwriter.h" |
| 11 | #include "jsonparser.h" |
| 12 | #include <fstream> |
| 13 | #include <iostream> |
| 14 | #include <jsonrpccpp/common/jsonparser.h> |
| 15 | |
| 16 | using namespace std; |
| 17 | using namespace jsonrpc; |
| 18 | |
| 19 | Json::Value SpecificationWriter::toJsonValue(const vector<Procedure> &procedures) { |
| 20 | Json::Value result; |
| 21 | Json::Value row; |
| 22 | for (unsigned int i = 0; i < procedures.size(); i++) { |
| 23 | procedureToJsonValue(procedures.at(i), row); |
| 24 | result[i] = row; |
| 25 | row.clear(); |
| 26 | } |
| 27 | return result; |
| 28 | } |
| 29 | std::string SpecificationWriter::toString(const vector<Procedure> &procedures) { |
| 30 | Json::StreamWriterBuilder wb; |
| 31 | wb["indentation"] = " "; |
| 32 | return Json::writeString(wb, toJsonValue(procedures)); |
| 33 | } |
| 34 | bool SpecificationWriter::toFile(const std::string &filename, const vector<Procedure> &procedures) { |
| 35 | ofstream file; |
| 36 | file.open(filename.c_str(), ios_base::out); |
| 37 | if (!file.is_open()) |
| 38 | return false; |
| 39 | file << toString(procedures); |
| 40 | file.close(); |
| 41 | return true; |
| 42 | } |
| 43 | Json::Value SpecificationWriter::toJsonLiteral(jsontype_t type) { |
| 44 | Json::Value literal; |
| 45 | switch (type) { |
| 46 | case JSON_BOOLEAN: |
| 47 | literal = true; |
| 48 | break; |
| 49 | case JSON_STRING: |
| 50 | literal = "somestring"; |
| 51 | break; |
| 52 | case JSON_REAL: |
| 53 | literal = 1.0; |
| 54 | break; |
| 55 | case JSON_NUMERIC: |
| 56 | literal = 1.0; |
| 57 | break; |
| 58 | case JSON_ARRAY: |
| 59 | literal = Json::arrayValue; |
| 60 | break; |
| 61 | case JSON_OBJECT: |
| 62 | literal["objectkey"] = "objectvalue"; |
| 63 | break; |
| 64 | case JSON_INTEGER: |
| 65 | literal = 1; |
| 66 | break; |
| 67 | } |
| 68 | return literal; |
| 69 | } |
| 70 | void SpecificationWriter::procedureToJsonValue(const Procedure &procedure, Json::Value &target) { |
| 71 | target[KEY_SPEC_PROCEDURE_NAME] = procedure.GetProcedureName(); |
| 72 | if (procedure.GetProcedureType() == RPC_METHOD) { |
| 73 | target[KEY_SPEC_RETURN_TYPE] = toJsonLiteral(procedure.GetReturnType()); |
| 74 | } |
| 75 | for (parameterNameList_t::const_iterator it = procedure.GetParameters().begin(); it != procedure.GetParameters().end(); ++it) { |
| 76 | if (procedure.GetParameterDeclarationType() == PARAMS_BY_NAME) { |
| 77 | target[KEY_SPEC_PROCEDURE_PARAMETERS][it->first] = toJsonLiteral(it->second); |
| 78 | } else { |
| 79 | target[KEY_SPEC_PROCEDURE_PARAMETERS].append(toJsonLiteral(it->second)); |
| 80 | } |
| 81 | } |
| 82 | } |
| 83 |