packages feed

calamity 0.1.14.0 → 0.1.14.1

raw patch · 9 files changed

+57/−92 lines, 9 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- Calamity.Internal.AesonThings: WithSpecialCasesInner :: a -> WithSpecialCasesInner (rules :: SpecialCaseList) a
- Calamity.Internal.AesonThings: [$sel:unwrapWithSpecialCases:WithSpecialCasesInner] :: WithSpecialCasesInner (rules :: SpecialCaseList) a -> a
- Calamity.Internal.AesonThings: data SpecialRule (label :: Symbol) (action :: SpecialRuleAction)
- Calamity.Internal.AesonThings: instance (Calamity.Internal.AesonThings.RunSpecialCase rules, Data.Typeable.Internal.Typeable a, GHC.Generics.Generic a, Data.Aeson.Types.FromJSON.GFromJSON Data.Aeson.Types.Generic.Zero (GHC.Generics.Rep a)) => Data.Aeson.Types.FromJSON.FromJSON (Calamity.Internal.AesonThings.WithSpecialCasesInner rules a)
- Calamity.Internal.AesonThings: instance (GHC.TypeLits.KnownSymbol field, Calamity.Internal.AesonThings.PerformAction ('Calamity.Internal.AesonThings.ExtractFields fields)) => Calamity.Internal.AesonThings.PerformAction ('Calamity.Internal.AesonThings.ExtractFields (field : fields))
- Calamity.Internal.AesonThings: instance (GHC.TypeLits.KnownSymbol idn, GHC.TypeLits.KnownSymbol mn) => Calamity.Internal.AesonThings.PerformAction ('Calamity.Internal.AesonThings.InjectID idn mn)
- Calamity.Internal.AesonThings: instance Calamity.Internal.AesonThings.PerformAction ('Calamity.Internal.AesonThings.ExtractFields '[])
- Calamity.Internal.AesonThings: instance Calamity.Internal.AesonThings.RunSpecialCase 'Calamity.Internal.AesonThings.SpecialCaseNil
- Calamity.Internal.AesonThings: instance GHC.TypeLits.KnownSymbol field => Calamity.Internal.AesonThings.PerformAction ('Calamity.Internal.AesonThings.ExtractArrayField field)
- Calamity.Internal.AesonThings: instance GHC.TypeLits.KnownSymbol field => Calamity.Internal.AesonThings.PerformAction ('Calamity.Internal.AesonThings.ExtractField field)
- Calamity.Internal.AesonThings: instance forall d1 (d2 :: d1). Data.Reflection.Reifies d2 Data.Aeson.Types.Internal.Value => Calamity.Internal.AesonThings.PerformAction ('Calamity.Internal.AesonThings.IfNoneThen d2)
- Calamity.Internal.AesonThings: instance forall inner1 (inner2 :: inner1) (label :: GHC.Types.Symbol) (action :: Calamity.Internal.AesonThings.SpecialRuleAction). (Calamity.Internal.AesonThings.RunSpecialCase inner2, GHC.TypeLits.KnownSymbol label, Calamity.Internal.AesonThings.PerformAction action) => Calamity.Internal.AesonThings.RunSpecialCase ('Calamity.Internal.AesonThings.SpecialCaseElem label action inner2)
- Calamity.Internal.AesonThings: newtype WithSpecialCasesInner (rules :: SpecialCaseList) a
- Calamity.Internal.AesonThings: type ExtractArrayField label field = SpecialRule label ('ExtractArrayField field)
- Calamity.Internal.AesonThings: type ExtractField label field = SpecialRule label ('ExtractField field)
- Calamity.Internal.AesonThings: type ExtractFields label fields = SpecialRule label ('ExtractFields fields)
- Calamity.Internal.AesonThings: type IfNoneThen label d = SpecialRule label ('IfNoneThen d)
- Calamity.Internal.AesonThings: type InjectID label mn idn = SpecialRule label ('InjectID mn idn)
- Calamity.Internal.AesonThings: type family WithSpecialCases rules a :: Type
+ Calamity.Internal.AesonThings: WithSpecialCases :: a -> WithSpecialCases (rules :: [Type]) a
+ Calamity.Internal.AesonThings: data ExtractArrayField label field
+ Calamity.Internal.AesonThings: data ExtractFieldInto label field target
+ Calamity.Internal.AesonThings: data ExtractFields label fields
+ Calamity.Internal.AesonThings: data IfNoneThen label def
+ Calamity.Internal.AesonThings: instance (Calamity.Internal.AesonThings.RunSpecialCase rules, Data.Typeable.Internal.Typeable a, GHC.Generics.Generic a, Data.Aeson.Types.FromJSON.GFromJSON Data.Aeson.Types.Generic.Zero (GHC.Generics.Rep a)) => Data.Aeson.Types.FromJSON.FromJSON (Calamity.Internal.AesonThings.WithSpecialCases rules a)
+ Calamity.Internal.AesonThings: instance (GHC.TypeLits.KnownSymbol label, GHC.TypeLits.KnownSymbol field) => Calamity.Internal.AesonThings.PerformAction (Calamity.Internal.AesonThings.ExtractArrayField label field)
+ Calamity.Internal.AesonThings: instance (GHC.TypeLits.KnownSymbol label, GHC.TypeLits.KnownSymbol field, GHC.TypeLits.KnownSymbol target) => Calamity.Internal.AesonThings.PerformAction (Calamity.Internal.AesonThings.ExtractFieldInto label field target)
+ Calamity.Internal.AesonThings: instance Calamity.Internal.AesonThings.RunSpecialCase '[]
+ Calamity.Internal.AesonThings: instance forall a (xs :: [a]) (action :: a). (Calamity.Internal.AesonThings.RunSpecialCase xs, Calamity.Internal.AesonThings.PerformAction action) => Calamity.Internal.AesonThings.RunSpecialCase (action : xs)
+ Calamity.Internal.AesonThings: instance forall k (d :: k) (label :: GHC.Types.Symbol). (Data.Reflection.Reifies d Data.Aeson.Types.Internal.Value, GHC.TypeLits.KnownSymbol label) => Calamity.Internal.AesonThings.PerformAction (Calamity.Internal.AesonThings.IfNoneThen label d)
+ Calamity.Internal.AesonThings: instance forall k (field :: GHC.Types.Symbol) (label :: k) (fields :: [GHC.Types.Symbol]). (GHC.TypeLits.KnownSymbol field, Calamity.Internal.AesonThings.PerformAction (Calamity.Internal.AesonThings.ExtractFieldInto label field field), Calamity.Internal.AesonThings.PerformAction (Calamity.Internal.AesonThings.ExtractFields label fields)) => Calamity.Internal.AesonThings.PerformAction (Calamity.Internal.AesonThings.ExtractFields label (field : fields))
+ Calamity.Internal.AesonThings: instance forall k1 k2 (label :: k1). Calamity.Internal.AesonThings.PerformAction (Calamity.Internal.AesonThings.ExtractFields label '[])
+ Calamity.Internal.AesonThings: newtype WithSpecialCases (rules :: [Type]) a
+ Calamity.Internal.AesonThings: type ExtractFieldFrom label field = ExtractFieldInto label field label
- Calamity.Cache.Eff: delDM :: forall r_a9NTk. MemberWithError CacheEff r_a9NTk => Snowflake DMChannel -> Sem r_a9NTk ()
+ Calamity.Cache.Eff: delDM :: forall r_a9NAo. MemberWithError CacheEff r_a9NAo => Snowflake DMChannel -> Sem r_a9NAo ()
- Calamity.Cache.Eff: delGuild :: forall r_a9NTd. MemberWithError CacheEff r_a9NTd => Snowflake Guild -> Sem r_a9NTd ()
+ Calamity.Cache.Eff: delGuild :: forall r_a9NAh. MemberWithError CacheEff r_a9NAh => Snowflake Guild -> Sem r_a9NAh ()
- Calamity.Cache.Eff: delMessage :: forall r_a9NTF. MemberWithError CacheEff r_a9NTF => Snowflake Message -> Sem r_a9NTF ()
+ Calamity.Cache.Eff: delMessage :: forall r_a9NAJ. MemberWithError CacheEff r_a9NAJ => Snowflake Message -> Sem r_a9NAJ ()
- Calamity.Cache.Eff: delUnavailableGuild :: forall r_a9NTy. MemberWithError CacheEff r_a9NTy => Snowflake Guild -> Sem r_a9NTy ()
+ Calamity.Cache.Eff: delUnavailableGuild :: forall r_a9NAC. MemberWithError CacheEff r_a9NAC => Snowflake Guild -> Sem r_a9NAC ()
- Calamity.Cache.Eff: delUser :: forall r_a9NTr. MemberWithError CacheEff r_a9NTr => Snowflake User -> Sem r_a9NTr ()
+ Calamity.Cache.Eff: delUser :: forall r_a9NAv. MemberWithError CacheEff r_a9NAv => Snowflake User -> Sem r_a9NAv ()
- Calamity.Cache.Eff: getBotUser :: forall r_a9NT5. MemberWithError CacheEff r_a9NT5 => Sem r_a9NT5 (Maybe User)
+ Calamity.Cache.Eff: getBotUser :: forall r_a9NA9. MemberWithError CacheEff r_a9NA9 => Sem r_a9NA9 (Maybe User)
- Calamity.Cache.Eff: getDM :: forall r_a9NTh. MemberWithError CacheEff r_a9NTh => Snowflake DMChannel -> Sem r_a9NTh (Maybe DMChannel)
+ Calamity.Cache.Eff: getDM :: forall r_a9NAl. MemberWithError CacheEff r_a9NAl => Snowflake DMChannel -> Sem r_a9NAl (Maybe DMChannel)
- Calamity.Cache.Eff: getDMs :: forall r_a9NTj. MemberWithError CacheEff r_a9NTj => Sem r_a9NTj [DMChannel]
+ Calamity.Cache.Eff: getDMs :: forall r_a9NAn. MemberWithError CacheEff r_a9NAn => Sem r_a9NAn [DMChannel]
- Calamity.Cache.Eff: getGuild :: forall r_a9NT8. MemberWithError CacheEff r_a9NT8 => Snowflake Guild -> Sem r_a9NT8 (Maybe Guild)
+ Calamity.Cache.Eff: getGuild :: forall r_a9NAc. MemberWithError CacheEff r_a9NAc => Snowflake Guild -> Sem r_a9NAc (Maybe Guild)
- Calamity.Cache.Eff: getGuildChannel :: forall r_a9NTa. MemberWithError CacheEff r_a9NTa => Snowflake GuildChannel -> Sem r_a9NTa (Maybe GuildChannel)
+ Calamity.Cache.Eff: getGuildChannel :: forall r_a9NAe. MemberWithError CacheEff r_a9NAe => Snowflake GuildChannel -> Sem r_a9NAe (Maybe GuildChannel)
- Calamity.Cache.Eff: getGuilds :: forall r_a9NTc. MemberWithError CacheEff r_a9NTc => Sem r_a9NTc [Guild]
+ Calamity.Cache.Eff: getGuilds :: forall r_a9NAg. MemberWithError CacheEff r_a9NAg => Sem r_a9NAg [Guild]
- Calamity.Cache.Eff: getMessage :: forall r_a9NTC. MemberWithError CacheEff r_a9NTC => Snowflake Message -> Sem r_a9NTC (Maybe Message)
+ Calamity.Cache.Eff: getMessage :: forall r_a9NAG. MemberWithError CacheEff r_a9NAG => Snowflake Message -> Sem r_a9NAG (Maybe Message)
- Calamity.Cache.Eff: getMessages :: forall r_a9NTE. MemberWithError CacheEff r_a9NTE => Sem r_a9NTE [Message]
+ Calamity.Cache.Eff: getMessages :: forall r_a9NAI. MemberWithError CacheEff r_a9NAI => Sem r_a9NAI [Message]
- Calamity.Cache.Eff: getUnavailableGuilds :: forall r_a9NTx. MemberWithError CacheEff r_a9NTx => Sem r_a9NTx [Snowflake Guild]
+ Calamity.Cache.Eff: getUnavailableGuilds :: forall r_a9NAB. MemberWithError CacheEff r_a9NAB => Sem r_a9NAB [Snowflake Guild]
- Calamity.Cache.Eff: getUser :: forall r_a9NTo. MemberWithError CacheEff r_a9NTo => Snowflake User -> Sem r_a9NTo (Maybe User)
+ Calamity.Cache.Eff: getUser :: forall r_a9NAs. MemberWithError CacheEff r_a9NAs => Snowflake User -> Sem r_a9NAs (Maybe User)
- Calamity.Cache.Eff: getUsers :: forall r_a9NTq. MemberWithError CacheEff r_a9NTq => Sem r_a9NTq [User]
+ Calamity.Cache.Eff: getUsers :: forall r_a9NAu. MemberWithError CacheEff r_a9NAu => Sem r_a9NAu [User]
- Calamity.Cache.Eff: isUnavailableGuild :: forall r_a9NTv. MemberWithError CacheEff r_a9NTv => Snowflake Guild -> Sem r_a9NTv Bool
+ Calamity.Cache.Eff: isUnavailableGuild :: forall r_a9NAz. MemberWithError CacheEff r_a9NAz => Snowflake Guild -> Sem r_a9NAz Bool
- Calamity.Cache.Eff: setBotUser :: forall r_a9NT3. MemberWithError CacheEff r_a9NT3 => User -> Sem r_a9NT3 ()
+ Calamity.Cache.Eff: setBotUser :: forall r_a9NA7. MemberWithError CacheEff r_a9NA7 => User -> Sem r_a9NA7 ()
- Calamity.Cache.Eff: setDM :: forall r_a9NTf. MemberWithError CacheEff r_a9NTf => DMChannel -> Sem r_a9NTf ()
+ Calamity.Cache.Eff: setDM :: forall r_a9NAj. MemberWithError CacheEff r_a9NAj => DMChannel -> Sem r_a9NAj ()
- Calamity.Cache.Eff: setGuild :: forall r_a9NT6. MemberWithError CacheEff r_a9NT6 => Guild -> Sem r_a9NT6 ()
+ Calamity.Cache.Eff: setGuild :: forall r_a9NAa. MemberWithError CacheEff r_a9NAa => Guild -> Sem r_a9NAa ()
- Calamity.Cache.Eff: setMessage :: forall r_a9NTA. MemberWithError CacheEff r_a9NTA => Message -> Sem r_a9NTA ()
+ Calamity.Cache.Eff: setMessage :: forall r_a9NAE. MemberWithError CacheEff r_a9NAE => Message -> Sem r_a9NAE ()
- Calamity.Cache.Eff: setUnavailableGuild :: forall r_a9NTt. MemberWithError CacheEff r_a9NTt => Snowflake Guild -> Sem r_a9NTt ()
+ Calamity.Cache.Eff: setUnavailableGuild :: forall r_a9NAx. MemberWithError CacheEff r_a9NAx => Snowflake Guild -> Sem r_a9NAx ()
- Calamity.Cache.Eff: setUser :: forall r_a9NTm. MemberWithError CacheEff r_a9NTm => User -> Sem r_a9NTm ()
+ Calamity.Cache.Eff: setUser :: forall r_a9NAq. MemberWithError CacheEff r_a9NAq => User -> Sem r_a9NAq ()
- Calamity.Commands.ParsePrefix: parsePrefix :: forall r_a7r6K. MemberWithError ParsePrefix r_a7r6K => Message -> Sem r_a7r6K (Maybe (Text, Text))
+ Calamity.Commands.ParsePrefix: parsePrefix :: forall r_a7qNL. MemberWithError ParsePrefix r_a7qNL => Message -> Sem r_a7qNL (Maybe (Text, Text))
- Calamity.Internal.LocalWriter: llisten :: forall o_aEvt r_aELt a_XEvt. MemberWithError (LocalWriter o_aEvt) r_aELt => Sem r_aELt a_XEvt -> Sem r_aELt (o_aEvt, a_XEvt)
+ Calamity.Internal.LocalWriter: llisten :: forall o_aE2p r_aEip a_XE2p. MemberWithError (LocalWriter o_aE2p) r_aEip => Sem r_aEip a_XE2p -> Sem r_aEip (o_aE2p, a_XE2p)
- Calamity.Internal.LocalWriter: ltell :: forall o_aEvp r_aELr. MemberWithError (LocalWriter o_aEvp) r_aELr => o_aEvp -> Sem r_aELr ()
+ Calamity.Internal.LocalWriter: ltell :: forall o_aE2l r_aEin. MemberWithError (LocalWriter o_aE2l) r_aEin => o_aE2l -> Sem r_aEin ()
- Calamity.Internal.RunIntoIO: intoIO :: forall p_aFOB r_aFOD r_aFTI. MemberWithError (IntoIO p_aFOB r_aFOD) r_aFTI => (p_aFOB -> Sem r_aFTI r_aFOD) -> Sem r_aFTI (p_aFOB -> IO (Maybe r_aFOD))
+ Calamity.Internal.RunIntoIO: intoIO :: forall p_aFlY r_aFm0 r_aFr5. MemberWithError (IntoIO p_aFlY r_aFm0) r_aFr5 => (p_aFlY -> Sem r_aFr5 r_aFm0) -> Sem r_aFr5 (p_aFlY -> IO (Maybe r_aFm0))
- Calamity.Metrics.Eff: addCounter :: forall r_aIAT. MemberWithError MetricEff r_aIAT => Int -> Counter -> Sem r_aIAT Int
+ Calamity.Metrics.Eff: addCounter :: forall r_aI8g. MemberWithError MetricEff r_aI8g => Int -> Counter -> Sem r_aI8g Int
- Calamity.Metrics.Eff: modifyGauge :: forall r_aIAW. MemberWithError MetricEff r_aIAW => (Double -> Double) -> Gauge -> Sem r_aIAW Double
+ Calamity.Metrics.Eff: modifyGauge :: forall r_aI8j. MemberWithError MetricEff r_aI8j => (Double -> Double) -> Gauge -> Sem r_aI8j Double
- Calamity.Metrics.Eff: observeHistogram :: forall r_aIAZ. MemberWithError MetricEff r_aIAZ => Double -> Histogram -> Sem r_aIAZ HistogramSample
+ Calamity.Metrics.Eff: observeHistogram :: forall r_aI8m. MemberWithError MetricEff r_aI8m => Double -> Histogram -> Sem r_aI8m HistogramSample
- Calamity.Metrics.Eff: registerCounter :: forall r_aIAJ. MemberWithError MetricEff r_aIAJ => Text -> [(Text, Text)] -> Sem r_aIAJ Counter
+ Calamity.Metrics.Eff: registerCounter :: forall r_aI86. MemberWithError MetricEff r_aI86 => Text -> [(Text, Text)] -> Sem r_aI86 Counter
- Calamity.Metrics.Eff: registerGauge :: forall r_aIAM. MemberWithError MetricEff r_aIAM => Text -> [(Text, Text)] -> Sem r_aIAM Gauge
+ Calamity.Metrics.Eff: registerGauge :: forall r_aI89. MemberWithError MetricEff r_aI89 => Text -> [(Text, Text)] -> Sem r_aI89 Gauge
- Calamity.Metrics.Eff: registerHistogram :: forall r_aIAP. MemberWithError MetricEff r_aIAP => Text -> [(Text, Text)] -> [Double] -> Sem r_aIAP Histogram
+ Calamity.Metrics.Eff: registerHistogram :: forall r_aI8c. MemberWithError MetricEff r_aI8c => Text -> [(Text, Text)] -> [Double] -> Sem r_aI8c Histogram

Files

ChangeLog.md view
@@ -1,5 +1,11 @@ # Changelog for Calamity +## 0.1.14.1++*2020-06-08*++* Fix broken json decoding for member's+ ## 0.1.14.0  *2020-06-08*
calamity.cabal view
@@ -4,10 +4,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: d770f5d135638e3a804e22c7d2f45e4b065401028478fe7cff6ccc542244ca35+-- hash: 17e82ecf5c56e8f6cd338935a102965df59d7bdfffee1d9c0461ac66c9089a7c  name:           calamity-version:        0.1.14.0+version:        0.1.14.1 synopsis:       A library for writing discord bots description:    Please see the README on GitHub at <https://github.com/nitros12/calamity#readme> category:       Network, Web
src/Calamity/Gateway/DispatchEvents.hs view
@@ -164,7 +164,7 @@   }   deriving ( Show, Generic )   deriving ( FromJSON ) via WithSpecialCases-      '["inviter" `ExtractField` "id", "targetUser" `ExtractField` "id"]+      '["inviter" `ExtractFieldFrom` "id", "targetUser" `ExtractFieldFrom` "id"]       InviteCreateData  data InviteDeleteData = InviteDeleteData
src/Calamity/Internal/AesonThings.hs view
@@ -1,12 +1,10 @@ module Calamity.Internal.AesonThings-    ( WithSpecialCases-    , WithSpecialCasesInner(..)-    , type IfNoneThen-    , type ExtractField-    , type ExtractFields-    , type ExtractArrayField-    , type InjectID-    , SpecialRule+    ( WithSpecialCases(..)+    , IfNoneThen+    , ExtractFieldFrom+    , ExtractFieldInto+    , ExtractFields+    , ExtractArrayField     , DefaultToEmptyArray     , DefaultToZero     , DefaultToFalse@@ -26,103 +24,64 @@ import           Data.Typeable  import           GHC.Generics-import qualified GHC.TypeLits          as TL-import           GHC.TypeLits          ( KnownSymbol, Symbol, symbolVal )-import Control.Monad ((>=>))--textSymbolVal :: forall n. KnownSymbol n => Proxy n -> Text-textSymbolVal _ = symbolVal @n Proxy ^. packed--data SpecialCaseList-  = SpecialCaseNil-  | forall label action inner. SpecialCaseElem label action inner--data SpecialRule (label :: Symbol) (action :: SpecialRuleAction)--data SpecialRuleAction-  = forall d. IfNoneThen d-  | forall field. ExtractField field-  | forall fields. ExtractFields fields-  | forall field. ExtractArrayField field-  | forall mn idn. InjectID idn mn--type IfNoneThen label d =-  SpecialRule label ('IfNoneThen d)--type ExtractField label field =-  SpecialRule label ('ExtractField field)--type ExtractFields label fields =-  SpecialRule label ('ExtractFields fields)+import           GHC.TypeLits          ( KnownSymbol, symbolVal )+import           Control.Monad ((>=>)) -type ExtractArrayField label field =-  SpecialRule label ('ExtractArrayField field)+textSymbolVal :: forall n. KnownSymbol n => Text+textSymbolVal = symbolVal @n Proxy ^. packed -type InjectID label mn idn =-  SpecialRule label ('InjectID mn idn)+data IfNoneThen label def+data ExtractFieldInto label field target+type ExtractFieldFrom label field = ExtractFieldInto label field label+data ExtractFields label fields+data ExtractArrayField label field -class PerformAction (action :: SpecialRuleAction) where-  runAction :: Proxy action -> Value -> Parser Value+class PerformAction action where+  runAction :: Proxy action -> Object -> Parser Object -instance Reifies d Value => PerformAction ('IfNoneThen d) where-  runAction _ Null = pure $ reflect @d Proxy-  runAction _ x = pure x+instance (Reifies d Value, KnownSymbol label) => PerformAction (IfNoneThen label d) where+  runAction _ o = do+    v <- o .:? textSymbolVal @label .!= reflect @d Proxy+    pure $ o & at (textSymbolVal @label) ?~ v -instance (KnownSymbol field) => PerformAction ('ExtractField field) where-  runAction _ Null = pure Null-  runAction _ o = withObject (("extracting field " <> textSymbolVal @field Proxy) ^. unpacked)-    (.: textSymbolVal @field Proxy) o+instance (KnownSymbol label, KnownSymbol field, KnownSymbol target) => PerformAction (ExtractFieldInto label field target) where+  runAction _ o =+    let v :: Maybe Value = o ^? ix (textSymbolVal @label) . _Object . ix (textSymbolVal @field)+    in pure $ o & at (textSymbolVal @target) .~ v -instance PerformAction ('ExtractFields '[]) where+instance PerformAction (ExtractFields label '[]) where   runAction _ = pure -instance (KnownSymbol field, PerformAction ('ExtractFields fields)) => PerformAction ('ExtractFields (field : fields)) where-  runAction _ = runAction (Proxy @('ExtractField field)) >=> runAction (Proxy @('ExtractFields fields))--instance KnownSymbol field => PerformAction ('ExtractArrayField field) where-  runAction _ Null = pure Null-  runAction _ o = withArray (("extracting fields " <> textSymbolVal @field Proxy) ^. unpacked)-    ((Array <$>) . traverse (withObject "extracting field" (.: textSymbolVal @field Proxy))) o--instance (KnownSymbol idn, KnownSymbol mn) => PerformAction ('InjectID idn mn) where-  runAction _ = withObject-    (("injecting id from " <> textSymbolVal @idn Proxy <> " into " <> textSymbolVal @mn Proxy) ^. unpacked) $ \o -> do-      id <- o .: "id"--      pure (Object o-            & key (textSymbolVal @mn Proxy) . values . _Object . at (textSymbolVal @idn Proxy) ?~ id)--type family FoldSpecialCases (rules :: [Type]) :: SpecialCaseList where-  FoldSpecialCases '[]                              = 'SpecialCaseNil-  FoldSpecialCases (SpecialRule label action ': xs) = 'SpecialCaseElem label action (FoldSpecialCases xs)-  FoldSpecialCases _ = TL.TypeError ('TL.Text "What did you do?")+instance (KnownSymbol field,+          PerformAction (ExtractFieldInto label field field),+          PerformAction (ExtractFields label fields)) =>+         PerformAction (ExtractFields label (field : fields)) where+  runAction _ = runAction (Proxy @(ExtractFieldInto label field field)) >=> runAction (Proxy @(ExtractFields label fields)) -newtype WithSpecialCasesInner (rules :: SpecialCaseList) a = WithSpecialCasesInner-  { unwrapWithSpecialCases :: a-  }+instance (KnownSymbol label, KnownSymbol field) => PerformAction (ExtractArrayField label field) where+  runAction _ o = do+    a :: Array <- o .: textSymbolVal @label+    a' <- Array <$> traverse (withObject "extracting field" (.: textSymbolVal @field)) a+    pure $ o & at (textSymbolVal @label) ?~ a' -type family WithSpecialCases rules a :: Type where-  WithSpecialCases rules a = WithSpecialCasesInner (FoldSpecialCases rules) a+newtype WithSpecialCases (rules :: [Type]) a = WithSpecialCases a  class RunSpecialCase a where   runSpecialCases :: Proxy a -> Object -> Parser Object -instance RunSpecialCase 'SpecialCaseNil where+instance RunSpecialCase '[] where   runSpecialCases _ = pure . id -instance (RunSpecialCase inner, KnownSymbol label, PerformAction action)-  => RunSpecialCase ('SpecialCaseElem label action inner) where+instance (RunSpecialCase xs, PerformAction action) => RunSpecialCase (action : xs) where   runSpecialCases _ o = do-    o' <- runSpecialCases (Proxy @inner) o-    v <- o' .:? textSymbolVal @label Proxy .!= Null-    v' <- runAction (Proxy @action) v-    pure (o' & at (textSymbolVal @label Proxy) ?~ v')+    o' <- runSpecialCases (Proxy @xs) o+    runAction (Proxy @action) o'  instance (RunSpecialCase rules, Typeable a, Generic a, GFromJSON Zero (Rep a))-  => FromJSON (WithSpecialCasesInner rules a) where+  => FromJSON (WithSpecialCases rules a) where   parseJSON = withObject (show . typeRep $ Proxy @a) $ \o -> do     o' <- runSpecialCases (Proxy @rules) o-    WithSpecialCasesInner <$> genericParseJSON jsonOptions (Object o')+    WithSpecialCases <$> genericParseJSON jsonOptions (Object o')   data DefaultToEmptyArray
src/Calamity/Types/Model/Channel/Message.hs view
@@ -47,7 +47,7 @@   deriving ( TextShow ) via TSG.FromGeneric Message   deriving ( ToJSON ) via CalamityJSON Message   deriving ( FromJSON ) via WithSpecialCases-      '["author" `ExtractField` "id", "mentions" `ExtractArrayField` "id",+      '["author" `ExtractFieldFrom` "id", "mentions" `ExtractArrayField` "id",         "reactions" `IfNoneThen` DefaultToEmptyArray]       Message   deriving ( HasID Message ) via HasIDField "id" Message
src/Calamity/Types/Model/Channel/UpdatedMessage.hs view
@@ -37,7 +37,7 @@   deriving ( Eq, Show, Generic )   deriving ( TextShow ) via TSG.FromGeneric UpdatedMessage   deriving ( FromJSON ) via WithSpecialCases-      '["author" `ExtractField` "id", "mentions" `ExtractArrayField` "id"]+      '["author" `ExtractFieldFrom` "id", "mentions" `ExtractArrayField` "id"]       UpdatedMessage   deriving ( HasID Message ) via HasIDField "id" UpdatedMessage   deriving ( HasID Channel ) via HasIDField "channelID" UpdatedMessage
src/Calamity/Types/Model/Channel/Webhook.hs view
@@ -28,5 +28,5 @@   }   deriving ( Eq, Show, Generic )   deriving ( TextShow ) via TSG.FromGeneric Webhook-  deriving ( FromJSON ) via WithSpecialCases '["user" `ExtractField` "id"] Webhook+  deriving ( FromJSON ) via WithSpecialCases '["user" `ExtractFieldFrom` "id"] Webhook   deriving ( HasID Webhook ) via HasIDField "id" Webhook
src/Calamity/Types/Model/Guild/Emoji.hs view
@@ -31,7 +31,7 @@   deriving ( Eq, Show, Generic )   deriving ( TextShow ) via TSG.FromGeneric Emoji   deriving ( ToJSON ) via CalamityJSON Emoji-  deriving ( FromJSON ) via WithSpecialCases '["user" `ExtractField` "id"] Emoji+  deriving ( FromJSON ) via WithSpecialCases '["user" `ExtractFieldFrom` "id"] Emoji   deriving ( HasID Emoji ) via HasIDField "id" Emoji  data instance Partial Emoji = PartialEmoji
src/Calamity/Types/Model/Guild/Invite.hs view
@@ -28,4 +28,4 @@   deriving ( Eq, Show, Generic )   deriving ( TextShow ) via TSG.FromGeneric Invite   deriving ( ToJSON ) via CalamityJSON Invite-  deriving ( FromJSON ) via WithSpecialCases '["targetUser" `ExtractField` "id"] Invite+  deriving ( FromJSON ) via WithSpecialCases '["targetUser" `ExtractFieldFrom` "id"] Invite