generic-override-aeson 0.0.0.0 → 0.0.0.2
raw patch · 5 files changed
+144/−29 lines, 5 filesdep ~aesondep ~generic-overridePVP ok
version bump matches the API change (PVP)
Dependency ranges changed: aeson, generic-override
API changes (from Hackage documentation)
Files
- CHANGELOG.md +9/−0
- README.md +75/−0
- generic-override-aeson.cabal +32/−27
- src/Data/Override/Aeson.hs +1/−1
- test/Test.hs +27/−1
+ CHANGELOG.md view
@@ -0,0 +1,9 @@+# Changelog for generic-override-aeson++## 0.0.0.1++* Bumping dependency bounds to support aeson 1.5++## 0.0.0.0++* Initial release
+ README.md view
@@ -0,0 +1,75 @@+# generic-override++[](https://hackage.haskell.org/package/generic-override)+[](http://travis-ci.org/estatico/generic-override)++For the associated blog post describing how this works, see+[Overriding Type Class Instances](http://caryrobbins.com/dev/overriding-type-class-instances-2/).++-------------------------++This repo contains the following libraries -+* [generic-override](https://hackage.haskell.org/package/generic-override)+* [generic-override-aeson](https://hackage.haskell.org/package/generic-override-aeson)++-------------------------++This library provides the ability to override instances used by generic derivation.++## Example++```haskell+-- Needed for constructing our 'Override' type in the DerivingVia clause.+import Data.Override (Override(Override), As)+-- Provides aeson support for generic-override (lives in generic-override-aeson).+import Data.Override.Aeson ()+-- Basic imports we need for the example.+import Data.Aeson (ToJSON(toJSON))+import Data.Text (Text)+import qualified Data.Text as Text++-- | A simple record type. We'll use generic derivation for the 'ToJSON' instance+-- but override the instances used by derivation for the 'String' and 'baz'+-- fields.+data MyRec = MyRec+ { foo :: Int+ , bar :: String+ , baz :: Text+ } deriving stock (Show, Eq, Generic)+ deriving (ToJSON)+ via Override MyRec+ '[ -- Derive the 'String' field via 'CharArray'.+ String `As` CharArray+ -- Derive the 'baz' field via 'Uptext'.+ , "baz" `As` Uptext+ ]++-- | Newtype wrapper to override 'ToJSON Text' instances with ones that+-- encode the 'Text' as uppercase.+newtype Uptext = Uptext { unUptext :: Text }++instance ToJSON Uptext where+ toJSON = toJSON . Text.toUpper . unUptext++-- | Newtype wrapper to override 'ToJSON String' instances with ones that+-- encode the 'String' as a JSON array of characters.+newtype CharArray = CharArray { unCharArray :: String }++instance ToJSON CharArray where+ toJSON = toJSON . map (:[]) . unCharArray+```++Let's serialize an example `MyRec` to JSON -++```haskell+% ghci+> :{+ Data.ByteString.Lazy.Char8.putStrLn+ $ Data.Aeson.encode+ $ Data.Aeson.toJSON MyRec { foo = 12, bar = "hi", baz = "bye" }+ :}+{"foo":12,"bar":["h","i"],"baz":"BYE"}+```++For more examples, see the test suite in+[generic-override-aeson](https://github.com/estatico/generic-override/blob/master/generic-override-aeson/test/Test.hs).
generic-override-aeson.cabal view
@@ -1,48 +1,53 @@-cabal-version: 1.12-name: generic-override-aeson-version: 0.0.0.0-license: BSD3-license-file: LICENSE-copyright: 2020 Estatico Studios LLC-maintainer: carymrobbins@gmail.com-author: Cary Robbins-homepage: https://github.com/estatico/generic-override#readme-bug-reports: https://github.com/estatico/generic-override/issues-synopsis: Provides orphan instances necessary for integrating generic-override and aeson+cabal-version: 1.12+name: generic-override-aeson+version: 0.0.0.2+license: BSD3+license-file: LICENSE+copyright: 2020 Estatico Studios LLC+maintainer: carymrobbins@gmail.com+author: Cary Robbins+homepage: https://github.com/estatico/generic-override#readme+bug-reports: https://github.com/estatico/generic-override/issues+synopsis:+ Provides orphan instances necessary for integrating generic-override and aeson+ description: Please see the README on GitHub at <https://github.com/estatico/generic-override#readme>-category: Generics-build-type: Simple +category: Generics+build-type: Simple+extra-source-files:+ README.md+ CHANGELOG.md+ source-repository head- type: git+ type: git location: https://github.com/estatico/generic-override library- exposed-modules:- Data.Override.Aeson- hs-source-dirs: src- other-modules:- Paths_generic_override_aeson+ exposed-modules: Data.Override.Aeson+ hs-source-dirs: src+ other-modules: Paths_generic_override_aeson default-language: Haskell2010 build-depends:- aeson >=1.4.5.0 && <1.5,+ aeson >=1.4 && <1.6, base >=4.7 && <5,- generic-override >=0.0.0.0 && <0.1+ generic-override >=0.2.0.0 && <0.3 test-suite generic-override-aeson-test- type: exitcode-stdio-1.0- main-is: Test.hs- hs-source-dirs: test+ type: exitcode-stdio-1.0+ main-is: Test.hs+ hs-source-dirs: test other-modules: LispCaseAeson Paths_generic_override_aeson+ default-language: Haskell2010- ghc-options: -threaded -rtsopts -with-rtsopts=-N+ ghc-options: -threaded -rtsopts -with-rtsopts=-N build-depends:- aeson >=1.4.5.0 && <1.5,+ aeson >=1.4 && <1.6, base >=4.7 && <5,- generic-override >=0.0.0.0 && <0.1,+ generic-override >=0.2.0.0 && <0.3, generic-override-aeson -any, hspec >=2.7.1 && <2.8, text >=1.2.3.1 && <1.3
src/Data/Override/Aeson.hs view
@@ -15,7 +15,7 @@ module Data.Override.Aeson where import Data.Coerce (Coercible, coerce)-import Data.Override (Override, Overridden(Overridden), Using)+import Data.Override.Internal (Override, Overridden(Overridden), Using) import GHC.Generics (Generic, Rep) import qualified Data.Aeson as Aeson
test/Test.hs view
@@ -15,7 +15,7 @@ import Data.Aeson (FromJSON(parseJSON), ToJSON(toJSON), Result(Success), fromJSON) import Data.Aeson.QQ.Simple (aesonQQ)-import Data.Override (Override(Override), As)+import Data.Override (Override(Override), As, With) import Data.Override.Aeson () import Data.Text (Text) import GHC.Generics (Generic)@@ -33,6 +33,7 @@ it "Rec4" testRec4 it "Rec5" testRec5 it "Rec6" testRec6+ it "Rec7" testRec6 newtype Uptext = Uptext { unUptext :: Text } @@ -198,6 +199,31 @@ testRec6 :: IO () testRec6 = do let r = Rec6 { foo = 1, bar = "hi", baz = "bye" }+ let j = [aesonQQ|+ {+ "foo": "1",+ "bar": ["h", "i"],+ "baz": "bye"+ }+ |]+ toJSON r `shouldBe` j+ fromJSON j `shouldBe` Success r++-- Test 'Override' for both 'ToJSON' and 'FromJSON'.+data Rec7 = Rec7+ { foo :: Int+ , bar :: String+ , baz :: Text+ } deriving stock (Show, Eq, Generic)+ deriving (ToJSON, FromJSON)+ via Override Rec7+ '[ "foo" `With` Shown+ , String `With` CharArray+ ]++testRec7 :: IO ()+testRec7 = do+ let r = Rec7 { foo = 1, bar = "hi", baz = "bye" } let j = [aesonQQ| { "foo": "1",