ncdo_clientgen
Version:
Client generator for NCDO
168 lines (152 loc) • 5.82 kB
JavaScript
var fs = require("fs"),
sep = require('path').sep,
DDS = require('./generateSchema').DDS;
module.exports = function (resource, clientName, clientPath) {
var content = [];
function genOperation(operation) {
function genParams(operation) {
var paramStr = "";
for (var paramNdx in operation.params) {
var param = operation.params[paramNdx];
if (param.type === "REQUEST_BODY") {
if (paramStr !== "") paramStr += ", ";
if (DDS.DS.indexOf(param.name) !== -1)
paramStr += `${param.name} ${param.name}`;
else if (DDS.TT.indexOf(param.name) !== -1)
paramStr += `${param.name} ${param.name}`;
else
paramStr += `string ${param.name}`;
}
}
if (paramStr !== "") paramStr += ", ";
paramStr += `CancellationToken cancellationToken = default(CancellationToken)`;
return paramStr;
}
function genParams2(operation) {
var params = [];
for (var paramNdx in operation.params) {
var param = operation.params[paramNdx];
if (param.type === "REQUEST_BODY") {
if (DDS.DS.indexOf(param.name) !== -1)
params.push(` paramObj.Add("${param.name}", ${param.name});`);
else if (DDS.TT.indexOf(param.name) !== -1)
params.push(` paramObj.Add("${param.name}", ${param.name});`);
else {
params.push(` if (string.IsNullOrEmpty(${param.name}))`);
params.push(` paramObj.Add("${param.name}", null);`);
params.push(` else paramObj.Add("${param.name}", ${param.name});`);
}
}
}
return params;
}
function genResponseParam(operation) {
var responseParams = [];
for (var paramNdx in operation.params) {
var param = operation.params[paramNdx];
if (param.type === "RESPONSE_BODY") {
if (DDS.DS.indexOf(param.name) !== -1)
responseParams.push(`${param.name} ${param.name}`);
else if (DDS.TT.indexOf(param.name) !== -1)
responseParams.push(`${param.name} ${param.name}`);
else
responseParams.push(`string ${param.name}`);
}
}
if (responseParams.length > 1)
return `<(${responseParams.join(", ")})>`;
else if (responseParams.length === 1)
return `<${responseParams.join("").split(" ")[0]}>`;
return "";
}
function genResponseParam2(operation) {
var responseParams = [];
for (var paramNdx in operation.params) {
var param = operation.params[paramNdx];
if (param.type === "RESPONSE_BODY") {
if (DDS.DS.indexOf(param.name) !== -1)
responseParams.push(`new ${param.name}(cdoRequest.Response.Get("${param.name}") as IEnumerable<KeyValuePair<string, JsonValue>>)`);
else if (DDS.TT.indexOf(param.name) !== -1)
responseParams.push(`new ${param.name}(cdoRequest.Response.Get("${param.name}").Get("${param.name}").Cast<JsonObject>())`);
else
responseParams.push(`cdoRequest.Response.Get("${param.name}").AsString()`);
}
}
if (responseParams.length > 1)
return `return (${responseParams.join(", ")});`;
else if (responseParams.length === 1)
return `return ${responseParams.join(", ")};`;
return "return;";
}
var content = [
` public async Task${genResponseParam(operation)} ${operation.name}(${genParams(operation)})`,
" {",
" cancellationToken.ThrowIfCancellationRequested();",
" ThrowIfDisposed();",
` var paramObj = new JsonObject();`
];
content = content.concat(genParams2(operation));
content = content.concat([
` ICDORequest cdoRequest = await Invoke("${operation.name}", paramObj, cancellationToken);`,
// ` if (cdoRequest.Success.HasValue && cdoRequest.Success.Value)`,
` ${genResponseParam2(operation)}`,
// ` throw new CDOException($"{cdoRequest.ResponseMessage.StatusCode} - {cdoRequest.ResponseMessage.RequestMessage.RequestUri}");`,
" }",
]);
return content;
}
function genTableRef(tableRef) {
return ` public ${tableRef} ${tableRef} => _cdoMemory.${tableRef};`;
}
function genCDOBase(resource) {
var schema = resource.schema, dsName = "CDO_Dataset", trName = "CDO_Record", dsTableRefs;
if (schema) {
for (var pndx in schema.properties) {
dsName = pndx;
dsTableRefs = schema.properties[pndx].properties;
for (var tableRef in dsTableRefs) {
trName = `tr${tableRef.replace(/^tt/, "")}`;
break;
}
break;
}
}
content = content.concat([
"using System.Collections.Generic;",
"using System.Json;",
"using System.Linq;",
"using System.Threading;",
"using System.Threading.Tasks;",
"using NCDO;",
"using NCDO.Extensions;",
"using NCDO.Interfaces;",
`using ${clientName}.Models;`,
`using ${clientName}.Models.Records;`,
`using ${clientName}.Models.Tables;`,
"",
`namespace ${clientName}.CDO`,
"{",
` public partial class ${resource.name} : ACloudDataObject<JsonObject, ${dsName}, ${trName}>`,
" {",
` public ${resource.name}(ICDOSession cDOSession = null, bool autoFill = false) : base("${resource.name}", cDOSession, autoFill)`,
" {",
" }"
]);
for (var tableRef in dsTableRefs) {
content = content.concat(genTableRef(tableRef));
}
for (var ondx in resource.operations) {
if (resource.operations[ondx].type === "invoke")
content = content.concat(genOperation(resource.operations[ondx]));
}
content = content.concat([
" }",
"}"
]);
}
if (resource) {
genCDOBase(resource);
console.log(`${clientPath}${sep}CDO${sep}${resource.name}.cs`);
fs.writeFileSync(`${clientPath}${sep}CDO${sep}${resource.name}.cs`, content.join('\n'));
}
}