@@ -245,37 +245,40 @@ func parseMicroflowObjectCollection(raw map[string]any) *microflows.MicroflowObj
245245 return collection
246246}
247247
248+ // microflowObjectParsers maps Mendix $Type strings to their parser functions.
249+ // Adding support for a new type requires only one new entry here.
250+ // Declared as a nil var and populated in init() so that the map literal can
251+ // reference parseLoopedActivity, which itself calls parseMicroflowObjectCollection,
252+ // keeping the package-level initialization order unambiguous.
253+ var microflowObjectParsers map [string ]func (map [string ]any ) microflows.MicroflowObject
254+
255+ func init () {
256+ microflowObjectParsers = map [string ]func (map [string ]any ) microflows.MicroflowObject {
257+ "Microflows$StartEvent" : func (r map [string ]any ) microflows.MicroflowObject { return parseStartEvent (r ) },
258+ "Microflows$EndEvent" : func (r map [string ]any ) microflows.MicroflowObject { return parseEndEvent (r ) },
259+ "Microflows$ErrorEvent" : func (r map [string ]any ) microflows.MicroflowObject { return parseErrorEvent (r ) },
260+ "Microflows$ActionActivity" : func (r map [string ]any ) microflows.MicroflowObject { return parseActionActivity (r ) },
261+ "Microflows$ExclusiveSplit" : func (r map [string ]any ) microflows.MicroflowObject { return parseExclusiveSplit (r ) },
262+ "Microflows$ExclusiveMerge" : func (r map [string ]any ) microflows.MicroflowObject { return parseExclusiveMerge (r ) },
263+ "Microflows$InheritanceSplit" : func (r map [string ]any ) microflows.MicroflowObject { return parseInheritanceSplit (r ) },
264+ "Microflows$LoopedActivity" : func (r map [string ]any ) microflows.MicroflowObject { return parseLoopedActivity (r ) },
265+ "Microflows$BreakEvent" : func (r map [string ]any ) microflows.MicroflowObject { return parseBreakEvent (r ) },
266+ "Microflows$ContinueEvent" : func (r map [string ]any ) microflows.MicroflowObject { return parseContinueEvent (r ) },
267+ "Microflows$Annotation" : func (r map [string ]any ) microflows.MicroflowObject { return parseMicroflowAnnotation (r ) },
268+ }
269+ }
270+
248271// parseMicroflowObject parses a single microflow object based on its $Type.
272+ // Returns nil for elements with an empty $Type (corrupt or placeholder records).
249273func parseMicroflowObject (raw map [string ]any ) microflows.MicroflowObject {
250274 typeName , _ := raw ["$Type" ].(string )
251-
252- switch typeName {
253- case "Microflows$StartEvent" :
254- return parseStartEvent (raw )
255- case "Microflows$EndEvent" :
256- return parseEndEvent (raw )
257- case "Microflows$ErrorEvent" :
258- return parseErrorEvent (raw )
259- case "Microflows$ActionActivity" :
260- return parseActionActivity (raw )
261- case "Microflows$ExclusiveSplit" :
262- return parseExclusiveSplit (raw )
263- case "Microflows$ExclusiveMerge" :
264- return parseExclusiveMerge (raw )
265- case "Microflows$InheritanceSplit" :
266- return parseInheritanceSplit (raw )
267- case "Microflows$LoopedActivity" :
268- return parseLoopedActivity (raw )
269- case "Microflows$BreakEvent" :
270- return parseBreakEvent (raw )
271- case "Microflows$ContinueEvent" :
272- return parseContinueEvent (raw )
273- case "Microflows$Annotation" :
274- return parseMicroflowAnnotation (raw )
275- default :
276- // Unknown type - return nil or a generic object
275+ if typeName == "" {
277276 return nil
278277 }
278+ if fn , ok := microflowObjectParsers [typeName ]; ok {
279+ return fn (raw )
280+ }
281+ return newUnknownObject (typeName , raw )
279282}
280283
281284func parseStartEvent (raw map [string ]any ) * microflows.StartEvent {
@@ -447,85 +450,68 @@ func parseActionActivity(raw map[string]any) *microflows.ActionActivity {
447450 return activity
448451}
449452
450- // parseMicroflowAction parses a microflow action based on its $Type.
451- func parseMicroflowAction (raw map [string ]any ) microflows.MicroflowAction {
452- typeName , _ := raw ["$Type" ].(string )
453-
454- switch typeName {
453+ // microflowActionParsers maps Mendix $Type strings to their action parser functions.
454+ // Storage names (e.g. CreateChangeAction) and qualified names (e.g. CreateObjectAction)
455+ // both map to the same parser to handle BSON format variations.
456+ var microflowActionParsers = map [string ]func (map [string ]any ) microflows.MicroflowAction {
455457 // Variable actions
456- case "Microflows$CreateVariableAction" :
457- return parseCreateVariableAction (raw )
458- case "Microflows$ChangeVariableAction" :
459- return parseChangeVariableAction (raw )
458+ "Microflows$CreateVariableAction" : func (r map [string ]any ) microflows.MicroflowAction { return parseCreateVariableAction (r ) },
459+ "Microflows$ChangeVariableAction" : func (r map [string ]any ) microflows.MicroflowAction { return parseChangeVariableAction (r ) },
460460
461461 // Object actions (storageName may differ from qualifiedName)
462- case "Microflows$CreateObjectAction" , "Microflows$CreateChangeAction" :
463- return parseCreateObjectAction (raw )
464- case "Microflows$ChangeObjectAction" , "Microflows$ChangeAction" :
465- return parseChangeObjectAction (raw )
466- case "Microflows$DeleteAction" :
467- return parseDeleteAction (raw )
468- case "Microflows$CommitAction" :
469- return parseCommitAction (raw )
470- case "Microflows$RollbackAction" :
471- return parseRollbackAction (raw )
462+ "Microflows$CreateObjectAction" : func (r map [string ]any ) microflows.MicroflowAction { return parseCreateObjectAction (r ) },
463+ "Microflows$CreateChangeAction" : func (r map [string ]any ) microflows.MicroflowAction { return parseCreateObjectAction (r ) },
464+ "Microflows$ChangeObjectAction" : func (r map [string ]any ) microflows.MicroflowAction { return parseChangeObjectAction (r ) },
465+ "Microflows$ChangeAction" : func (r map [string ]any ) microflows.MicroflowAction { return parseChangeObjectAction (r ) },
466+ "Microflows$DeleteAction" : func (r map [string ]any ) microflows.MicroflowAction { return parseDeleteAction (r ) },
467+ "Microflows$CommitAction" : func (r map [string ]any ) microflows.MicroflowAction { return parseCommitAction (r ) },
468+ "Microflows$RollbackAction" : func (r map [string ]any ) microflows.MicroflowAction { return parseRollbackAction (r ) },
472469
473470 // Retrieve actions
474- case "Microflows$RetrieveAction" :
475- return parseRetrieveAction (raw )
476- case "Microflows$AggregateListAction" , "Microflows$AggregateAction" : // AggregateAction is storageName
477- return parseAggregateListAction (raw )
471+ "Microflows$RetrieveAction" : func (r map [string ]any ) microflows.MicroflowAction { return parseRetrieveAction (r ) },
472+ "Microflows$AggregateListAction" : func (r map [string ]any ) microflows.MicroflowAction { return parseAggregateListAction (r ) },
473+ "Microflows$AggregateAction" : func (r map [string ]any ) microflows.MicroflowAction { return parseAggregateListAction (r ) },
478474
479475 // List actions
480- case "Microflows$CreateListAction" :
481- return parseCreateListAction (raw )
482- case "Microflows$ChangeListAction" :
483- return parseChangeListAction (raw )
484- case "Microflows$ListOperationAction" , "Microflows$ListOperationsAction" : // ListOperationsAction is storageName
485- return parseListOperationAction (raw )
476+ "Microflows$CreateListAction" : func (r map [string ]any ) microflows.MicroflowAction { return parseCreateListAction (r ) },
477+ "Microflows$ChangeListAction" : func (r map [string ]any ) microflows.MicroflowAction { return parseChangeListAction (r ) },
478+ "Microflows$ListOperationAction" : func (r map [string ]any ) microflows.MicroflowAction { return parseListOperationAction (r ) },
479+ "Microflows$ListOperationsAction" : func (r map [string ]any ) microflows.MicroflowAction { return parseListOperationAction (r ) },
486480
487481 // Integration actions
488- case "Microflows$MicroflowCallAction" :
489- return parseMicroflowCallAction (raw )
490- case "Microflows$JavaActionCallAction" :
491- return parseJavaActionCallAction (raw )
492- case "Microflows$CallExternalAction" :
493- return parseCallExternalAction (raw )
494-
495- // Client actions
496- case "Microflows$ShowFormAction" , "Microflows$ShowPageAction" : // ShowFormAction is storageName
497- return parseShowPageAction (raw )
498- case "Microflows$ShowHomePageAction" :
499- return parseShowHomePageAction (raw )
500- case "Microflows$CloseFormAction" :
501- return parseClosePageAction (raw )
502- case "Microflows$ShowMessageAction" :
503- return parseShowMessageAction (raw )
504- case "Microflows$ValidationFeedbackAction" :
505- return parseValidationFeedbackAction (raw )
506- case "Microflows$DownloadFileAction" :
507- return parseDownloadFileAction (raw )
482+ "Microflows$MicroflowCallAction" : func (r map [string ]any ) microflows.MicroflowAction { return parseMicroflowCallAction (r ) },
483+ "Microflows$JavaActionCallAction" : func (r map [string ]any ) microflows.MicroflowAction { return parseJavaActionCallAction (r ) },
484+ "Microflows$CallExternalAction" : func (r map [string ]any ) microflows.MicroflowAction { return parseCallExternalAction (r ) },
485+
486+ // Client actions (ShowFormAction is storageName for ShowPageAction)
487+ "Microflows$ShowFormAction" : func (r map [string ]any ) microflows.MicroflowAction { return parseShowPageAction (r ) },
488+ "Microflows$ShowPageAction" : func (r map [string ]any ) microflows.MicroflowAction { return parseShowPageAction (r ) },
489+ "Microflows$ShowHomePageAction" : func (r map [string ]any ) microflows.MicroflowAction { return parseShowHomePageAction (r ) },
490+ "Microflows$CloseFormAction" : func (r map [string ]any ) microflows.MicroflowAction { return parseClosePageAction (r ) },
491+ "Microflows$ShowMessageAction" : func (r map [string ]any ) microflows.MicroflowAction { return parseShowMessageAction (r ) },
492+ "Microflows$ValidationFeedbackAction" : func (r map [string ]any ) microflows.MicroflowAction { return parseValidationFeedbackAction (r ) },
493+ "Microflows$DownloadFileAction" : func (r map [string ]any ) microflows.MicroflowAction { return parseDownloadFileAction (r ) },
508494
509495 // Log action
510- case "Microflows$LogMessageAction" :
511- return parseLogMessageAction (raw )
496+ "Microflows$LogMessageAction" : func (r map [string ]any ) microflows.MicroflowAction { return parseLogMessageAction (r ) },
512497
513498 // Cast action
514- case "Microflows$CastAction" :
515- return parseCastAction (raw )
499+ "Microflows$CastAction" : func (r map [string ]any ) microflows.MicroflowAction { return parseCastAction (r ) },
516500
517501 // REST call action
518- case "Microflows$RestCallAction" :
519- return parseRestCallAction (raw )
502+ "Microflows$RestCallAction" : func (r map [string ]any ) microflows.MicroflowAction { return parseRestCallAction (r ) },
520503
521504 // Database Connector action
522- case "DatabaseConnector$ExecuteDatabaseQueryAction" :
523- return parseExecuteDatabaseQueryAction ( raw )
505+ "DatabaseConnector$ExecuteDatabaseQueryAction" : func ( r map [ string ] any ) microflows. MicroflowAction { return parseExecuteDatabaseQueryAction ( r ) },
506+ }
524507
525- default :
526- // Return an unknown action placeholder with the type name
527- return & microflows.UnknownAction {TypeName : typeName }
508+ // parseMicroflowAction parses a microflow action based on its $Type.
509+ func parseMicroflowAction (raw map [string ]any ) microflows.MicroflowAction {
510+ typeName , _ := raw ["$Type" ].(string )
511+ if fn , ok := microflowActionParsers [typeName ]; ok {
512+ return fn (raw )
528513 }
514+ return & microflows.UnknownAction {TypeName : typeName }
529515}
530516
531517func parseCreateVariableAction (raw map [string ]any ) * microflows.CreateVariableAction {
0 commit comments