Skip to content

Commit

Permalink
Defaults for non-mandatory arguments in instance creation json mapping
Browse files Browse the repository at this point in the history
  • Loading branch information
ytsejam78 committed Sep 27, 2024
1 parent 7ada0ab commit 68bab55
Showing 1 changed file with 36 additions and 17 deletions.
53 changes: 36 additions & 17 deletions source/Stargate-NeoJSON-Extensions/InstanceCreationMapping.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,25 @@ Class {
#superclass : 'NeoJSONObjectMapping',
#instVars : [
'instanceCreationSelector',
'argumentNames'
'argumentNames',
'defaultsByArgumentName'
],
#category : 'Stargate-NeoJSON-Extensions',
#package : 'Stargate-NeoJSON-Extensions'
}

{ #category : 'mapping' }
InstanceCreationMapping >> argumentNamed: anArgumentName defaultingTo: aValue [

defaultsByArgumentName at: anArgumentName put: aValue
]

{ #category : 'private' }
InstanceCreationMapping >> defaultFor: argumentName ifAbsent: aBlock [

^ defaultsByArgumentName at: argumentName ifAbsent: aBlock
]

{ #category : 'private' }
InstanceCreationMapping >> errorDescriptionForMissing: propertyNames [

Expand All @@ -40,8 +53,9 @@ InstanceCreationMapping >> errorDescriptionForMissing: propertyNames [
{ #category : 'mapping' }
InstanceCreationMapping >> mapCreationSending: anInstanceCreationSelector withArguments: anArgumentCollection [

instanceCreationSelector := anInstanceCreationSelector.
argumentNames := anArgumentCollection
instanceCreationSelector := anInstanceCreationSelector.
argumentNames := anArgumentCollection.
defaultsByArgumentName := Dictionary new
]

{ #category : 'mapping' }
Expand All @@ -62,20 +76,25 @@ InstanceCreationMapping >> mapProperty: aKey as: aValueSchema [
{ #category : 'parsing' }
InstanceCreationMapping >> readFrom: jsonReader [

| argumentByName arguments missingArguments |

argumentByName := Dictionary new.
jsonReader parseMapKeysDo: [ :key |
( self propertyNamed: key ifAbsent: [ nil ] )
ifNil: [ "read, skip & ignore value" jsonReader next ]
ifNotNil: [ :mapping | mapping readObject: argumentByName from: jsonReader ]
].
| argumentByName arguments missingArguments |
argumentByName := Dictionary new.
jsonReader parseMapKeysDo: [ :key |
( self propertyNamed: key ifAbsent: [ nil ] )
ifNil: [ "read, skip & ignore value" jsonReader next ]
ifNotNil: [ :mapping | mapping readObject: argumentByName from: jsonReader ]
].

missingArguments := OrderedCollection new.
arguments := argumentNames collect: [ :argumentName |
argumentByName at: argumentName ifAbsent: [ missingArguments add: argumentName ] ].
missingArguments ifNotEmpty: [
jsonReader error: ( self errorDescriptionForMissing: missingArguments ) ].
missingArguments := OrderedCollection new.
arguments := argumentNames collect: [ :argumentName |
argumentByName
at: argumentName
ifAbsent: [
self
defaultFor: argumentName
ifAbsent: [ missingArguments add: argumentName ] ]
].
missingArguments ifNotEmpty: [
jsonReader error: ( self errorDescriptionForMissing: missingArguments ) ].

^ subjectClass perform: instanceCreationSelector withArguments: arguments
^ subjectClass perform: instanceCreationSelector withArguments: arguments
]

0 comments on commit 68bab55

Please sign in to comment.