@@ -200,10 +200,11 @@ data DataChecks = NoChecks -- ^ Not at all
200200
201201-- | Whether to validate the dataset after this change
202202validateAfter :: DataChecks -> APIChange -> Bool
203- validateAfter chks (ChChangeField {}) = chks >= CheckCustom
204- validateAfter chks (ChCustomType {}) = chks >= CheckCustom
205- validateAfter chks (ChCustomAll {}) = chks >= CheckCustom
206- validateAfter chks _ = chks >= CheckAll
203+ validateAfter chks (ChChangeField {}) = chks >= CheckCustom
204+ validateAfter chks (ChChangeUnionAlt {}) = chks >= CheckCustom
205+ validateAfter chks (ChCustomType {}) = chks >= CheckCustom
206+ validateAfter chks (ChCustomAll {}) = chks >= CheckCustom
207+ validateAfter chks _ = chks >= CheckAll
207208
208209
209210--------------------
@@ -255,10 +256,11 @@ changelogTags (ChangesUpTo _ cs older) =
255256
256257-- | Sets of custom migration tags in a single change
257258changeTags :: APIChange -> (Set MigrationTag , Set MigrationTag , Set MigrationTag )
258- changeTags (ChChangeField _ _ _ t) = (Set. empty, Set. empty, Set. singleton t)
259- changeTags (ChCustomType _ t) = (Set. empty, Set. singleton t, Set. empty)
260- changeTags (ChCustomAll t) = (Set. singleton t, Set. empty, Set. empty)
261- changeTags _ = (Set. empty, Set. empty, Set. empty)
259+ changeTags (ChChangeField _ _ _ t) = (Set. empty, Set. empty, Set. singleton t)
260+ changeTags (ChChangeUnionAlt _ _ _ t) = (Set. empty, Set. empty, Set. singleton t)
261+ changeTags (ChCustomType _ t) = (Set. empty, Set. singleton t, Set. empty)
262+ changeTags (ChCustomAll t) = (Set. singleton t, Set. empty, Set. empty)
263+ changeTags _ = (Set. empty, Set. empty, Set. empty)
262264
263265
264266--------------------------------
@@ -484,6 +486,13 @@ applyAPIChangeToAPI _ _ (ChRenameUnionAlt tname fname fname') api = do
484486 . Map. delete fname) unioninfo
485487 return (Map. insert tname tinfo' api, findUpdatePos tname api)
486488
489+ applyAPIChangeToAPI _ _custom (ChChangeUnionAlt tname fname ftype _tag) api = do
490+ tinfo <- lookupType tname api
491+ unioninfo <- expectUnionType tinfo ?! TypeWrongKind tname TKUnion
492+ guard (Map. member fname unioninfo) ?! FieldDoesNotExist tname TKUnion fname
493+ let tinfo' = (NUnionType . Map. insert fname ftype) unioninfo
494+ return (Map. insert tname tinfo' api, findUpdatePos tname api)
495+
487496applyAPIChangeToAPI _ _ (ChAddEnumVal tname fname) api = do
488497 tinfo <- lookupType tname api
489498 enuminfo <- expectEnumType tinfo ?! TypeWrongKind tname TKEnum
@@ -607,6 +616,13 @@ applyChangeToData (ChRenameUnionAlt _ fname fname') _ = withObject $ \un p ->
607616 | otherwise -> return un
608617 Nothing -> Left (JSONError $ SyntaxError " Not singleton" , p)
609618
619+ applyChangeToData (ChChangeUnionAlt _ fname _ftype tag) custom = withObject $ \ un p ->
620+ case matchSingletonObject un of
621+ Just (k, r) | k == _FieldName fname -> do
622+ r' <- liftMigration (fieldMigration custom tag) r p
623+ return $ singletonObject (_FieldName fname) r'
624+ _ -> return un
625+
610626applyChangeToData (ChRenameEnumVal _ fname fname') _ = withString $ \ s _ ->
611627 if s == _FieldName fname then return (_FieldName fname')
612628 else return s
@@ -718,6 +734,12 @@ applyChangeToData' _ (ChRenameUnionAlt _ fname fname') _ v p = do
718734 (fn, v') <- expectUnion v p
719735 pure $! if fn == fname then Union fname' v' else v
720736
737+ applyChangeToData' _ (ChChangeUnionAlt _ fname _ftype tag) custom v p = do
738+ (fn, v') <- expectUnion v p
739+ if fn == fname
740+ then Union fn <$!> liftMigration (fieldMigration custom tag) v' (inField fn: p)
741+ else pure v
742+
721743applyChangeToData' _ (ChRenameEnumVal _ fname fname') _ v p = do
722744 fn <- expectEnum v p
723745 pure $! if fn == fname then Enum fname' else v
0 commit comments