Skip to content

Commit

Permalink
working example of encoding/decoding Either
Browse files Browse the repository at this point in the history
  • Loading branch information
peterbecich committed Nov 26, 2023
1 parent c60400c commit 55e265b
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 9 deletions.
5 changes: 5 additions & 0 deletions example/packages.dhall
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@ let additions =
"https://github.com/coot/purescript-argonaut-aeson-generic.git"
, version = "v0.4.1"
}
, argonaut-codecs =
{ dependencies = [ "console" ]
, repo = "https://github.com/peterbecich/purescript-argonaut-codecs.git"
, version = "04abb3eb24a4deafe125be0eb23e2786c642e66b"
}
, foreign-generic =
{ dependencies =
[ "effect"
Expand Down
17 changes: 14 additions & 3 deletions example/src/Main.purs
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,27 @@ import Effect.Aff (launchAff_)
import Affjax.Web (get, post_)
import Affjax.ResponseFormat (json)
import Affjax.RequestBody as RequestBody
import Types (Foo, fooMessage, fooNumber, fooList)
import Foreign.Object (empty)
import Types (Foo, FEither(..), fooMessage, fooNumber, fooList)
import Data.Argonaut.Decode.Error (JsonDecodeError)
import Data.Argonaut.Decode.Generic (genericDecodeJson)
import Data.Argonaut.Encode.Generic (genericEncodeJson)
import Types (Foo, fooMessage, fooNumber, fooList, fooMap)
-- import Types (Foo, fooMessage, fooNumber, fooList, fooMap, fooTestSum, fooTestData)
import Types (Baz(Baz), Foo(Foo), TestData(..), TestSum(..), fooMessage, fooNumber, fooList, fooMap, fooTestSum, fooTestData)
import Data.Map as Map

import Foreign.Object as Object

testFoo = Foo
{ _fooMessage: "foo"
, _fooE: FEither (Left "foo")
, _fooNumber: 1
, _fooList: [1,2,3]
, _fooMap: empty
, _fooBaz: Baz { _bazMessage: "baz" }
, _fooTestSum: Nullary
, _fooTestData: TEither "foo"
}

main :: Effect Unit
main = log "Hello, Purescript!" *> launchAff_ do
-- "Foo" tests untagged JSON, i.e.:
Expand Down
30 changes: 24 additions & 6 deletions example/src/Types.hs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
module Types where

import Control.Lens.TH (makeLenses)
import Data.Aeson (FromJSON, ToJSON(toEncoding), defaultOptions, tagSingleConstructors, genericToEncoding, unwrapUnaryRecords)
import Data.Aeson (FromJSON, ToJSON(toEncoding), SumEncoding(..), defaultOptions, tagSingleConstructors, genericToEncoding, unwrapUnaryRecords, sumEncoding, defaultTaggedObject)
import qualified Data.Map.Lazy as Map
import Data.Proxy
import Data.Text
Expand All @@ -26,7 +26,17 @@ import Test.QuickCheck (Arbitrary (..), chooseEnum, oneof, resize,
data Baz = Baz
{ _bazMessage :: Text
}
deriving (FromJSON, Generic, ToJSON, Show)
deriving (FromJSON, Generic, Show)

instance ToJSON Baz where
toEncoding = genericToEncoding
(
defaultOptions
{ tagSingleConstructors = True
, unwrapUnaryRecords = True
}
)


makeLenses ''Baz

Expand Down Expand Up @@ -62,6 +72,7 @@ instance Arbitrary TestData where
TEither <$> arbitrary
]


data Foo = Foo
{ _fooMessage :: Text
, _fooE :: Either Text Int
Expand All @@ -75,17 +86,24 @@ data Foo = Foo
deriving (FromJSON, Generic, Show, ToJSON)



instance {-# OVERLAPPING #-} ToJSON (Either Text Int) where
toEncoding = genericToEncoding (defaultOptions { tagSingleConstructors = True, unwrapUnaryRecords = True })
toEncoding = genericToEncoding
(
defaultOptions
{ tagSingleConstructors = True
, unwrapUnaryRecords = True
-- , sumEncoding = TaggedObject "foo" "bar" -- defaultTaggedObject { contentsFieldName = "value" }
}
)

-- instance ToJSON Foo where
-- toEncoding = genericToEncoding (defaultOptions { tagSingleConstructors = True, unwrapUnaryRecords = True })
instance {-# OVERLAPPING #-} FromJSON (Either Text Int)

makeLenses ''Foo

-- TODO newtype
data Bar a = Bar a
deriving (FromJSON, Generic, Show, ToJSON, Typeable)
deriving (FromJSON, Generic, Show, Typeable, ToJSON)

makeLenses ''Bar

Expand Down

0 comments on commit 55e265b

Please sign in to comment.