@@ -160,123 +160,57 @@ protected TypedDynamoDbStreamBatchProcessor() : this(PowertoolsConfigurations.In
160160 /// <summary>
161161 /// Wrapper class that adapts ITypedRecordHandler to IRecordHandler.
162162 /// </summary>
163- private sealed class TypedRecordHandlerWrapper < T > : IRecordHandler < DynamoDBEvent . DynamodbStreamRecord >
163+ private sealed class TypedRecordHandlerWrapper < T > : TypedRecordHandlerWrapperBase < DynamoDBEvent . DynamodbStreamRecord , T >
164164 {
165165 private readonly ITypedRecordHandler < T > _typedHandler ;
166- private readonly IDeserializationService _deserializationService ;
167- private readonly IRecordDataExtractor < DynamoDBEvent . DynamodbStreamRecord > _recordDataExtractor ;
168- private readonly DeserializationOptions _deserializationOptions ;
169166
170167 public TypedRecordHandlerWrapper (
171168 ITypedRecordHandler < T > typedHandler ,
172169 IDeserializationService deserializationService ,
173170 IRecordDataExtractor < DynamoDBEvent . DynamodbStreamRecord > recordDataExtractor ,
174171 DeserializationOptions deserializationOptions )
172+ : base ( deserializationService , recordDataExtractor , deserializationOptions )
175173 {
176174 _typedHandler = typedHandler ?? throw new ArgumentNullException ( nameof ( typedHandler ) ) ;
177- _deserializationService = deserializationService ?? throw new ArgumentNullException ( nameof ( deserializationService ) ) ;
178- _recordDataExtractor = recordDataExtractor ?? throw new ArgumentNullException ( nameof ( recordDataExtractor ) ) ;
179- _deserializationOptions = deserializationOptions ;
180175 }
181176
182- public async Task < RecordHandlerResult > HandleAsync ( DynamoDBEvent . DynamodbStreamRecord record , CancellationToken cancellationToken )
177+ protected override async Task < RecordHandlerResult > HandleTypedRecordAsync ( T deserializedData , CancellationToken cancellationToken )
183178 {
184- try
185- {
186- var recordData = _recordDataExtractor . ExtractData ( record ) ;
187-
188- // Use TryDeserialize to check if deserialization was successful
189- if ( _deserializationOptions ? . ErrorPolicy == DeserializationErrorPolicy . IgnoreRecord ||
190- _deserializationOptions ? . IgnoreDeserializationErrors == true )
191- {
192- if ( ! _deserializationService . TryDeserialize < T > ( recordData , out var deserializedData , out _ , _deserializationOptions ) )
193- {
194- // Deserialization failed and we're ignoring errors, don't call the handler
195- return RecordHandlerResult . None ;
196- }
197- return await _typedHandler . HandleAsync ( deserializedData , cancellationToken ) ;
198- }
199- else
200- {
201- // Use regular deserialize which will throw on errors
202- var deserializedData = _deserializationService . Deserialize < T > ( recordData , _deserializationOptions ) ;
203- return await _typedHandler . HandleAsync ( deserializedData , cancellationToken ) ;
204- }
205- }
206- catch ( DeserializationException ex )
207- {
208- // Handle deserialization errors based on policy
209- if ( _deserializationOptions ? . ErrorPolicy == DeserializationErrorPolicy . IgnoreRecord )
210- {
211- return RecordHandlerResult . None ;
212- }
213-
214- // For FailRecord policy or default, re-throw the exception
215- throw new RecordProcessingException ( $ "Failed to deserialize DynamoDB stream record '{ record . Dynamodb . SequenceNumber } ' to type '{ typeof ( T ) . Name } '. See inner exception for details.", ex ) ;
216- }
179+ return await _typedHandler . HandleAsync ( deserializedData , cancellationToken ) ;
180+ }
181+
182+ protected override string GetDeserializationErrorMessage ( DynamoDBEvent . DynamodbStreamRecord record , DeserializationException ex )
183+ {
184+ return $ "Failed to deserialize DynamoDB stream record '{ record . Dynamodb . SequenceNumber } ' to type '{ typeof ( T ) . Name } '. See inner exception for details.";
217185 }
218186 }
219187
220188 /// <summary>
221189 /// Wrapper class that adapts ITypedRecordHandlerWithContext to IRecordHandler.
222190 /// </summary>
223- private sealed class TypedRecordHandlerWithContextWrapper < T > : IRecordHandler < DynamoDBEvent . DynamodbStreamRecord >
191+ private sealed class TypedRecordHandlerWithContextWrapper < T > : TypedRecordHandlerWithContextWrapperBase < DynamoDBEvent . DynamodbStreamRecord , T >
224192 {
225193 private readonly ITypedRecordHandlerWithContext < T > _typedHandler ;
226- private readonly ILambdaContext _context ;
227- private readonly IDeserializationService _deserializationService ;
228- private readonly IRecordDataExtractor < DynamoDBEvent . DynamodbStreamRecord > _recordDataExtractor ;
229- private readonly DeserializationOptions _deserializationOptions ;
230194
231195 public TypedRecordHandlerWithContextWrapper (
232196 ITypedRecordHandlerWithContext < T > typedHandler ,
233197 ILambdaContext context ,
234198 IDeserializationService deserializationService ,
235199 IRecordDataExtractor < DynamoDBEvent . DynamodbStreamRecord > recordDataExtractor ,
236200 DeserializationOptions deserializationOptions )
201+ : base ( context , deserializationService , recordDataExtractor , deserializationOptions )
237202 {
238203 _typedHandler = typedHandler ?? throw new ArgumentNullException ( nameof ( typedHandler ) ) ;
239- _context = context ; // Context can be null
240- _deserializationService = deserializationService ?? throw new ArgumentNullException ( nameof ( deserializationService ) ) ;
241- _recordDataExtractor = recordDataExtractor ?? throw new ArgumentNullException ( nameof ( recordDataExtractor ) ) ;
242- _deserializationOptions = deserializationOptions ;
243204 }
244205
245- public async Task < RecordHandlerResult > HandleAsync ( DynamoDBEvent . DynamodbStreamRecord record , CancellationToken cancellationToken )
206+ protected override async Task < RecordHandlerResult > HandleTypedRecordWithContextAsync ( T deserializedData , ILambdaContext context , CancellationToken cancellationToken )
207+ {
208+ return await _typedHandler . HandleAsync ( deserializedData , context , cancellationToken ) ;
209+ }
210+
211+ protected override string GetDeserializationErrorMessage ( DynamoDBEvent . DynamodbStreamRecord record , DeserializationException ex )
246212 {
247- try
248- {
249- var recordData = _recordDataExtractor . ExtractData ( record ) ;
250-
251- // Use TryDeserialize to check if deserialization was successful
252- if ( _deserializationOptions ? . ErrorPolicy == DeserializationErrorPolicy . IgnoreRecord ||
253- _deserializationOptions ? . IgnoreDeserializationErrors == true )
254- {
255- if ( ! _deserializationService . TryDeserialize < T > ( recordData , out var deserializedData , out _ , _deserializationOptions ) )
256- {
257- // Deserialization failed and we're ignoring errors, don't call the handler
258- return RecordHandlerResult . None ;
259- }
260- return await _typedHandler . HandleAsync ( deserializedData , _context , cancellationToken ) ;
261- }
262- else
263- {
264- // Use regular deserialize which will throw on errors
265- var deserializedData = _deserializationService . Deserialize < T > ( recordData , _deserializationOptions ) ;
266- return await _typedHandler . HandleAsync ( deserializedData , _context , cancellationToken ) ;
267- }
268- }
269- catch ( DeserializationException ex )
270- {
271- // Handle deserialization errors based on policy
272- if ( _deserializationOptions ? . ErrorPolicy == DeserializationErrorPolicy . IgnoreRecord )
273- {
274- return RecordHandlerResult . None ;
275- }
276-
277- // For FailRecord policy or default, re-throw the exception
278- throw new RecordProcessingException ( $ "Failed to deserialize DynamoDB stream record '{ record . Dynamodb . SequenceNumber } ' to type '{ typeof ( T ) . Name } '. See inner exception for details.", ex ) ;
279- }
213+ return $ "Failed to deserialize DynamoDB stream record '{ record . Dynamodb . SequenceNumber } ' to type '{ typeof ( T ) . Name } '. See inner exception for details.";
280214 }
281215 }
282216}
0 commit comments