From db9e63bac4f516e2b787d1f31b0dc83e597dddfc Mon Sep 17 00:00:00 2001 From: vato007 Date: Sat, 24 Aug 2024 17:02:15 +0930 Subject: [PATCH] Add support for populating objects in multiple nested lists --- .../proto-definition.service.spec.ts | 18 +++++++++++++++-- .../proto-definition.service.ts | 20 ++++++++++++++++++- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/app/proto-definition-selector/proto-definition.service.spec.ts b/src/app/proto-definition-selector/proto-definition.service.spec.ts index 3e319f4..192bd3a 100644 --- a/src/app/proto-definition-selector/proto-definition.service.spec.ts +++ b/src/app/proto-definition-selector/proto-definition.service.spec.ts @@ -38,11 +38,15 @@ message Test { } message ReferenceMessage { - string test = 1; + repeated DoubleNestedMessage test = 1; Test.NestedMessage nested_message = 2; EnumTest enum_test = 3; } +message DoubleNestedMessage { + string test = 1; +} + enum EnumTest { Hello = 0; } @@ -59,6 +63,7 @@ describe('TestService', () => { service = TestBed.inject(ProtoDefinitionService); }); + // TODO:c This needs to be split up to test one feature/definition per test it('should convert parsed protobuf correctly', async () => { const testMessages = await service.parseAllDefinitions([ new File( @@ -97,9 +102,18 @@ describe('TestService', () => { expect(referenceMessage.messageDefinition.name).toBe('ReferenceMessage'); const nestedReferenceMessage = referenceMessage.messageDefinition.values[0]; expect(nestedReferenceMessage.configuration.type).toBe( - MessageTypeEnum.String + MessageTypeEnum.List ); expect(nestedReferenceMessage.name).toBe('test'); + const doubleNestedListMessage = + nestedReferenceMessage.configuration as ListMessage; + expect(doubleNestedListMessage.subConfiguration.type).toBe( + MessageTypeEnum.Object + ); + expect( + (doubleNestedListMessage.subConfiguration as ObjectMessage) + .messageDefinition.values.length + ).toBe(1); const parentNestedMessage = referenceMessage.messageDefinition.values[1]; expect(parentNestedMessage.configuration.type).toBe(MessageTypeEnum.Object); expect(parentNestedMessage.name).toBe('nestedMessage'); diff --git a/src/app/proto-definition-selector/proto-definition.service.ts b/src/app/proto-definition-selector/proto-definition.service.ts index 0564f89..ec26a39 100644 --- a/src/app/proto-definition-selector/proto-definition.service.ts +++ b/src/app/proto-definition-selector/proto-definition.service.ts @@ -302,9 +302,27 @@ export class ProtoDefinitionService { objectMessage.messageDefinition = { name: objectMessage.messageDefinition.name, values: message.values.map((value) => { + let configuration: MessageConfiguration | null = null; if (value.configuration.type === MessageTypeEnum.Object) { + configuration = value.configuration; + } else if (value.configuration.type === MessageTypeEnum.List) { + const listConfiguration = value.configuration as ListMessage; + if ( + listConfiguration.subConfiguration.type === MessageTypeEnum.Object + ) { + configuration = listConfiguration.subConfiguration; + } + } else if (value.configuration.type === MessageTypeEnum.Map) { + const mapConfiguration = value.configuration as MapMessage; + if ( + mapConfiguration.valueConfiguration.type === MessageTypeEnum.Object + ) { + configuration = mapConfiguration.valueConfiguration; + } + } + if (configuration) { this.populateNestedObject( - value.configuration as ObjectMessage, + configuration as ObjectMessage, message.packageName!, availableMessages );