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 +6/−0
- calamity.cabal +2/−2
- src/Calamity/Gateway/DispatchEvents.hs +1/−1
- src/Calamity/Internal/AesonThings.hs +43/−84
- src/Calamity/Types/Model/Channel/Message.hs +1/−1
- src/Calamity/Types/Model/Channel/UpdatedMessage.hs +1/−1
- src/Calamity/Types/Model/Channel/Webhook.hs +1/−1
- src/Calamity/Types/Model/Guild/Emoji.hs +1/−1
- src/Calamity/Types/Model/Guild/Invite.hs +1/−1
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