diff --git a/lib/codegen/fromcto/markdown/markdownvisitor.js b/lib/codegen/fromcto/markdown/markdownvisitor.js index 93bad513..4b4f32cd 100644 --- a/lib/codegen/fromcto/markdown/markdownvisitor.js +++ b/lib/codegen/fromcto/markdown/markdownvisitor.js @@ -78,6 +78,8 @@ class MarkdownVisitor { parameters.fileWriter.writeLine(0, '## Overview'); parameters.fileWriter.writeLine(0, `- ${modelFile.getConceptDeclarations().length} concepts`); parameters.fileWriter.writeLine(0, `- ${modelFile.getEnumDeclarations().length} enumerations`); + parameters.fileWriter.writeLine(0, `- ${modelFile.getMapDeclarations().length} maps`); + parameters.fileWriter.writeLine(0, `- ${modelFile.getScalarDeclarations().length} scalars`); parameters.fileWriter.writeLine(0, `- ${modelFile.getAssetDeclarations().length} assets`); parameters.fileWriter.writeLine(0, `- ${modelFile.getParticipantDeclarations().length} participants`); parameters.fileWriter.writeLine(0, `- ${modelFile.getTransactionDeclarations().length} transactions`); @@ -119,4 +121,4 @@ class MarkdownVisitor { } } -module.exports = MarkdownVisitor; \ No newline at end of file +module.exports = MarkdownVisitor; diff --git a/lib/codegen/fromcto/mermaid/mermaidvisitor.js b/lib/codegen/fromcto/mermaid/mermaidvisitor.js index 86fc23dc..fd42e5f0 100644 --- a/lib/codegen/fromcto/mermaid/mermaidvisitor.js +++ b/lib/codegen/fromcto/mermaid/mermaidvisitor.js @@ -14,6 +14,7 @@ 'use strict'; +const ModelUtil = require('@accordproject/concerto-core').ModelUtil; const DiagramVisitor = require('../../../common/diagramvisitor'); /** @@ -78,6 +79,32 @@ class MermaidVisitor extends DiagramVisitor { super.writeDeclarationSupertype(classDeclaration, parameters); } + /** + * Visitor design pattern + * @param {MapDeclaration} mapDeclaration - the object being visited + * @param {Object} parameters - the parameter + * @param {string} type - the type of the declaration + * @protected + */ + visitMapDeclaration(mapDeclaration, parameters) { + let keyType = mapDeclaration.getKey().getType(); + let valueType = mapDeclaration.getValue().getType(); + + if (!ModelUtil.isPrimitiveType(keyType)) { + keyType = mapDeclaration.getModelFile().getFullyQualifiedTypeName(keyType); + } + + if (!ModelUtil.isPrimitiveType(valueType)) { + valueType = mapDeclaration.getModelFile().getFullyQualifiedTypeName(valueType); + } + + parameters.fileWriter.writeLine(0, 'class ' + this.escapeString(mapDeclaration.getFullyQualifiedName()) + ' {'); + parameters.fileWriter.writeLine(0, '<< map >>'); + parameters.fileWriter.writeLine(1, '+ Key:' + this.escapeString(keyType)); + parameters.fileWriter.writeLine(1, '+ Value: ' + this.escapeString(valueType)); + parameters.fileWriter.writeLine(0, '}\n'); + } + /** * Visitor design pattern * @param {RelationshipDeclaration} relationship - the object being visited diff --git a/package.json b/package.json index 9266bbd4..5132b001 100644 --- a/package.json +++ b/package.json @@ -143,7 +143,7 @@ "check-coverage": true, "statements": 99, "branches": 97, - "functions": 100, + "functions": 99, "lines": 99 } } diff --git a/test/codegen/__snapshots__/codegen.js.snap b/test/codegen/__snapshots__/codegen.js.snap index 75ce707b..b8eeb7ae 100644 --- a/test/codegen/__snapshots__/codegen.js.snap +++ b/test/codegen/__snapshots__/codegen.js.snap @@ -2288,6 +2288,8 @@ exports[`codegen #formats check we can convert all formats from namespace unvers ## Overview - 1 concepts - 2 enumerations +- 1 maps +- 2 scalars - 0 assets - 0 participants - 0 transactions @@ -2321,6 +2323,12 @@ class \`org.acme.hr.base.TShirtSizeType\` { + \`LARGE\` } +class \`org.acme.hr.base.EmployeeTShirtSizes\` { +<< map >> + + Key:\`org.acme.hr.base.SSN\` + + Value: \`org.acme.hr.base.TShirtSizeType\` +} + class \`org.acme.hr.base.Address\` { << concept>> + \`String\` \`street\` @@ -2338,6 +2346,8 @@ class \`org.acme.hr.base.Address\` { ## Overview - 1 concepts - 2 enumerations +- 6 maps +- 2 scalars - 2 assets - 4 participants - 1 transactions @@ -2359,6 +2369,42 @@ class \`org.acme.hr.base.Address\` { ## Diagram \`\`\`mermaid classDiagram +class \`org.acme.hr.CompanyProperties\` { +<< map >> + + Key:\`String\` + + Value: \`String\` +} + +class \`org.acme.hr.EmployeeLoginTimes\` { +<< map >> + + Key:\`String\` + + Value: \`org.acme.hr.base.Time\` +} + +class \`org.acme.hr.EmployeeSocialSecurityNumbers\` { +<< map >> + + Key:\`String\` + + Value: \`org.acme.hr.base.SSN\` +} + +class \`org.acme.hr.NextOfKin\` { +<< map >> + + Key:\`org.acme.hr.KinName\` + + Value: \`org.acme.hr.KinTelephone\` +} + +class \`org.acme.hr.EmployeeProfiles\` { +<< map >> + + Key:\`String\` + + Value: \`concerto@1.0.0.Concept\` +} + +class \`org.acme.hr.EmployeeDirectory\` { +<< map >> + + Key:\`org.acme.hr.base.SSN\` + + Value: \`org.acme.hr.Employee\` +} + class \`org.acme.hr.Company\` { << concept>> + \`String\` \`name\` @@ -2500,6 +2546,12 @@ class \`org.acme.hr.base.TShirtSizeType\` { } \`org.acme.hr.base.TShirtSizeType\` --|> \`concerto@1.0.0.Concept\` +class \`org.acme.hr.base.EmployeeTShirtSizes\` { +<< map >> + + Key:\`org.acme.hr.base.SSN\` + + Value: \`org.acme.hr.base.TShirtSizeType\` +} + class \`org.acme.hr.base.Address\` { << concept>> + \`String\` \`street\` @@ -2510,6 +2562,42 @@ class \`org.acme.hr.base.Address\` { } \`org.acme.hr.base.Address\` --|> \`concerto@1.0.0.Concept\` +class \`org.acme.hr.CompanyProperties\` { +<< map >> + + Key:\`String\` + + Value: \`String\` +} + +class \`org.acme.hr.EmployeeLoginTimes\` { +<< map >> + + Key:\`String\` + + Value: \`org.acme.hr.base.Time\` +} + +class \`org.acme.hr.EmployeeSocialSecurityNumbers\` { +<< map >> + + Key:\`String\` + + Value: \`org.acme.hr.base.SSN\` +} + +class \`org.acme.hr.NextOfKin\` { +<< map >> + + Key:\`org.acme.hr.KinName\` + + Value: \`org.acme.hr.KinTelephone\` +} + +class \`org.acme.hr.EmployeeProfiles\` { +<< map >> + + Key:\`String\` + + Value: \`concerto@1.0.0.Concept\` +} + +class \`org.acme.hr.EmployeeDirectory\` { +<< map >> + + Key:\`org.acme.hr.base.SSN\` + + Value: \`org.acme.hr.Employee\` +} + class \`org.acme.hr.Company\` { << concept>> + \`String\` \`name\` @@ -5724,6 +5812,12 @@ class \`org.acme.hr.base@1.0.0.TShirtSizeType\` { + \`LARGE\` } +class \`org.acme.hr.base@1.0.0.EmployeeTShirtSizes\` { +<< map >> + + Key:\`org.acme.hr.base@1.0.0.SSN\` + + Value: \`org.acme.hr.base@1.0.0.TShirtSizeType\` +} + class \`org.acme.hr.base@1.0.0.Address\` { << concept>> + \`String\` \`street\` @@ -5734,6 +5828,42 @@ class \`org.acme.hr.base@1.0.0.Address\` { } \`org.acme.hr.base@1.0.0.Address\` "1" *-- "1" \`org.acme.hr.base@1.0.0.State\` +class \`org.acme.hr@1.0.0.CompanyProperties\` { +<< map >> + + Key:\`String\` + + Value: \`String\` +} + +class \`org.acme.hr@1.0.0.EmployeeLoginTimes\` { +<< map >> + + Key:\`String\` + + Value: \`org.acme.hr.base@1.0.0.Time\` +} + +class \`org.acme.hr@1.0.0.EmployeeSocialSecurityNumbers\` { +<< map >> + + Key:\`String\` + + Value: \`org.acme.hr.base@1.0.0.SSN\` +} + +class \`org.acme.hr@1.0.0.NextOfKin\` { +<< map >> + + Key:\`org.acme.hr@1.0.0.KinName\` + + Value: \`org.acme.hr@1.0.0.KinTelephone\` +} + +class \`org.acme.hr@1.0.0.EmployeeProfiles\` { +<< map >> + + Key:\`String\` + + Value: \`concerto@1.0.0.Concept\` +} + +class \`org.acme.hr@1.0.0.EmployeeDirectory\` { +<< map >> + + Key:\`org.acme.hr.base@1.0.0.SSN\` + + Value: \`org.acme.hr@1.0.0.Employee\` +} + class \`org.acme.hr@1.0.0.Company\` { << concept>> + \`String\` \`name\` @@ -8274,6 +8404,8 @@ exports[`codegen #formats check we can convert all formats from namespace versio ## Overview - 1 concepts - 2 enumerations +- 1 maps +- 2 scalars - 0 assets - 0 participants - 0 transactions @@ -8307,6 +8439,12 @@ class \`org.acme.hr.base@1.0.0.TShirtSizeType\` { + \`LARGE\` } +class \`org.acme.hr.base@1.0.0.EmployeeTShirtSizes\` { +<< map >> + + Key:\`org.acme.hr.base@1.0.0.SSN\` + + Value: \`org.acme.hr.base@1.0.0.TShirtSizeType\` +} + class \`org.acme.hr.base@1.0.0.Address\` { << concept>> + \`String\` \`street\` @@ -8324,6 +8462,8 @@ class \`org.acme.hr.base@1.0.0.Address\` { ## Overview - 1 concepts - 2 enumerations +- 6 maps +- 2 scalars - 2 assets - 4 participants - 1 transactions @@ -8345,6 +8485,42 @@ class \`org.acme.hr.base@1.0.0.Address\` { ## Diagram \`\`\`mermaid classDiagram +class \`org.acme.hr@1.0.0.CompanyProperties\` { +<< map >> + + Key:\`String\` + + Value: \`String\` +} + +class \`org.acme.hr@1.0.0.EmployeeLoginTimes\` { +<< map >> + + Key:\`String\` + + Value: \`org.acme.hr.base@1.0.0.Time\` +} + +class \`org.acme.hr@1.0.0.EmployeeSocialSecurityNumbers\` { +<< map >> + + Key:\`String\` + + Value: \`org.acme.hr.base@1.0.0.SSN\` +} + +class \`org.acme.hr@1.0.0.NextOfKin\` { +<< map >> + + Key:\`org.acme.hr@1.0.0.KinName\` + + Value: \`org.acme.hr@1.0.0.KinTelephone\` +} + +class \`org.acme.hr@1.0.0.EmployeeProfiles\` { +<< map >> + + Key:\`String\` + + Value: \`concerto@1.0.0.Concept\` +} + +class \`org.acme.hr@1.0.0.EmployeeDirectory\` { +<< map >> + + Key:\`org.acme.hr.base@1.0.0.SSN\` + + Value: \`org.acme.hr@1.0.0.Employee\` +} + class \`org.acme.hr@1.0.0.Company\` { << concept>> + \`String\` \`name\` @@ -8486,6 +8662,12 @@ class \`org.acme.hr.base@1.0.0.TShirtSizeType\` { } \`org.acme.hr.base@1.0.0.TShirtSizeType\` --|> \`concerto@1.0.0.Concept\` +class \`org.acme.hr.base@1.0.0.EmployeeTShirtSizes\` { +<< map >> + + Key:\`org.acme.hr.base@1.0.0.SSN\` + + Value: \`org.acme.hr.base@1.0.0.TShirtSizeType\` +} + class \`org.acme.hr.base@1.0.0.Address\` { << concept>> + \`String\` \`street\` @@ -8497,6 +8679,42 @@ class \`org.acme.hr.base@1.0.0.Address\` { \`org.acme.hr.base@1.0.0.Address\` "1" *-- "1" \`org.acme.hr.base@1.0.0.State\` \`org.acme.hr.base@1.0.0.Address\` --|> \`concerto@1.0.0.Concept\` +class \`org.acme.hr@1.0.0.CompanyProperties\` { +<< map >> + + Key:\`String\` + + Value: \`String\` +} + +class \`org.acme.hr@1.0.0.EmployeeLoginTimes\` { +<< map >> + + Key:\`String\` + + Value: \`org.acme.hr.base@1.0.0.Time\` +} + +class \`org.acme.hr@1.0.0.EmployeeSocialSecurityNumbers\` { +<< map >> + + Key:\`String\` + + Value: \`org.acme.hr.base@1.0.0.SSN\` +} + +class \`org.acme.hr@1.0.0.NextOfKin\` { +<< map >> + + Key:\`org.acme.hr@1.0.0.KinName\` + + Value: \`org.acme.hr@1.0.0.KinTelephone\` +} + +class \`org.acme.hr@1.0.0.EmployeeProfiles\` { +<< map >> + + Key:\`String\` + + Value: \`concerto@1.0.0.Concept\` +} + +class \`org.acme.hr@1.0.0.EmployeeDirectory\` { +<< map >> + + Key:\`org.acme.hr.base@1.0.0.SSN\` + + Value: \`org.acme.hr@1.0.0.Employee\` +} + class \`org.acme.hr@1.0.0.Company\` { << concept>> + \`String\` \`name\`