@@ -289,7 +289,7 @@ object ContractDriftDemo {
289289 }
290290 */
291291
292- // Example 3: Extra field (will compile with Forward policy, fail with Exact)
292+ // Example 3: Extra field (will compile with Backward policy, fail with Exact)
293293 /*
294294 case class ExtraFieldUser(
295295 id: Long, name: String, email: String, age: Option[Int],
@@ -300,9 +300,9 @@ object ContractDriftDemo {
300300 def partiallyValidPipeline[F[_]: EffectSystem](): F[Unit] = {
301301 val source = TypedSource[ExtraFieldUser](DataSource.local( " input.csv " , DataFormat.CSV))
302302
303- // This will compile (Forward allows extra fields in source )
303+ // This will compile (Backward allows source to have extra fields that contract doesn't need )
304304 val workingPipeline = PipelineBuilder[F]( " working " )
305- .addTypedSource[ExtraFieldUser, RawUser, SchemaPolicy.Forward ](source, _ => ???)
305+ .addTypedSource[ExtraFieldUser, RawUser, SchemaPolicy.Backward ](source, _ => ???)
306306
307307 // This will NOT compile (Exact requires perfect match)
308308 val failingPipeline = PipelineBuilder[F]( " failing " )
@@ -334,23 +334,23 @@ object SchemaEvolutionPolicies {
334334 val baseSource = TypedSource[BaseUser](DataSource.local( " base.csv " , DataFormat.CSV))
335335 val extendedSource = TypedSource[ExtendedUser](DataSource.local( " extended.csv " , DataFormat.CSV))
336336
337- // 1. EXACT: Perfect match required
337+ // 1. EXACT: Perfect match required - source and contract must be identical
338338 val exactPipeline = PipelineBuilder[F]( " exact " )
339339 .addTypedSource[BaseUser, BaseUser, SchemaPolicy.Exact](baseSource, _ => F.pure(BaseUser(1, " Alice " , " alice@ example.com " )))
340340
341- // 2. BACKWARD: Reader produces more, contract expects less
341+ // 2. BACKWARD: Source has MORE fields than contract needs (contract is backward compatible)
342342 val backwardPipeline = PipelineBuilder[F]( " backward " )
343- .addTypedSource[ExtendedUser, BaseUser, SchemaPolicy.Backward](baseSource, _ => F.pure(ExtendedUser(1, " Bob " , " bob @ example. com " , Some(30), Some( " USA " ) )))
343+ .addTypedSource[ExtendedUser, BaseUser, SchemaPolicy.Backward](extendedSource, extUser => F.pure(BaseUser(extUser.id, extUser.name, extUser.email )))
344344
345- // 3. FORWARD: Contract expects more, reader produces less
345+ // 3. FORWARD: Contract expects MORE fields than source provides (contract is forward compatible)
346346 val forwardPipeline = PipelineBuilder[F]( " forward " )
347- .addTypedSource[BaseUser, ExtendedUser, SchemaPolicy.Forward](extendedSource, _ => F.pure(BaseUser(1, " Charlie " , " charlie @ example. com " )))
347+ .addTypedSource[BaseUser, ExtendedUser, SchemaPolicy.Forward](baseSource, baseUser => F.pure(ExtendedUser(baseUser.id, baseUser.name, baseUser.email, None, None )))
348348
349- // 4. EXACT_UNORDERED: Same fields, any order
349+ // 4. EXACT_UNORDERED: Same fields, any order (field order doesn't matter)
350350 val exactUnorderedPipeline = PipelineBuilder[F]( " exact- unordered " )
351351 .addTypedSource[BaseUser, BaseUser, SchemaPolicy.ExactUnordered](baseSource, _ => F.pure(BaseUser(1, " Diana " , " diana@ example.com " )))
352352
353- // 5. FULL: Allow anything (escape hatch)
353+ // 5. FULL: Allow anything (escape hatch - no validation )
354354 val fullPipeline = PipelineBuilder[F]( " full " )
355355 .addTypedSource[BaseUser, BaseUser, SchemaPolicy.Full](baseSource, _ => F.pure(BaseUser(1, " Eve " , " eve@ example.com " )))
356356
0 commit comments