mirror of
https://github.com/simonmichael/hledger.git
synced 2024-09-18 17:57:11 +03:00
web: more Decimal FromJSON notes
[ci skip]
This commit is contained in:
parent
420eef4a40
commit
8cf39e55e0
@ -92,24 +92,6 @@ instance ToJSON Account where
|
||||
|
||||
instance FromJSON Status
|
||||
instance FromJSON GenericSourcePos
|
||||
--
|
||||
-- Decimal
|
||||
--
|
||||
-- https://stackoverflow.com/questions/40331851/haskell-data-decimal-as-aeson-type
|
||||
----instance FromJSON Decimal where parseJSON =
|
||||
---- A.withScientific "Decimal" (return . right . eitherFromRational . toRational)
|
||||
--
|
||||
-- https://github.com/PaulJohnson/Haskell-Decimal/issues/6
|
||||
--deriving instance Generic Decimal
|
||||
--instance FromJSON Decimal
|
||||
deriving instance Generic (DecimalRaw Integer)
|
||||
instance FromJSON (DecimalRaw Integer)
|
||||
--
|
||||
-- https://github.com/bos/aeson/issues/474
|
||||
-- http://hackage.haskell.org/package/aeson-1.4.2.0/docs/Data-Aeson-TH.html
|
||||
-- $(deriveFromJSON defaultOptions ''Decimal) -- doesn't work
|
||||
-- $(deriveFromJSON defaultOptions ''DecimalRaw) -- works; requires TH, but gives better parse error messages
|
||||
--
|
||||
instance FromJSON Amount
|
||||
instance FromJSON AmountStyle
|
||||
instance FromJSON Side
|
||||
@ -124,6 +106,39 @@ instance FromJSON Transaction
|
||||
instance FromJSON AccountDeclarationInfo
|
||||
instance FromJSON Account
|
||||
|
||||
-- Decimal, various attempts
|
||||
--
|
||||
-- https://stackoverflow.com/questions/40331851/haskell-data-decimal-as-aeson-type
|
||||
----instance FromJSON Decimal where parseJSON =
|
||||
---- A.withScientific "Decimal" (return . right . eitherFromRational . toRational)
|
||||
--
|
||||
-- https://github.com/bos/aeson/issues/474
|
||||
-- http://hackage.haskell.org/package/aeson-1.4.2.0/docs/Data-Aeson-TH.html
|
||||
-- $(deriveFromJSON defaultOptions ''Decimal) -- doesn't work
|
||||
-- $(deriveFromJSON defaultOptions ''DecimalRaw) -- works; requires TH, but gives better parse error messages
|
||||
--
|
||||
-- https://github.com/PaulJohnson/Haskell-Decimal/issues/6
|
||||
--deriving instance Generic Decimal
|
||||
--instance FromJSON Decimal
|
||||
deriving instance Generic (DecimalRaw Integer)
|
||||
instance FromJSON (DecimalRaw Integer)
|
||||
--
|
||||
-- @simonmichael, I think the code in your first comment should work if it compiles—though “work” doesn’t mean you can parse a JSON number directly into a `Decimal` using the generic instance, as you’ve discovered.
|
||||
--
|
||||
--Error messages with these extensions are always rather cryptic, but I’d prefer them to Template Haskell. Typically you’ll want to start by getting a generic `ToJSON` instance working, then use that to figure out what the `FromJSON` instance expects to parse: for a correct instance, `encode` and `decode` should give you an isomorphism between your type and a subset of `Bytestring` (up to the `Maybe` wrapper that `decode` returns).
|
||||
--
|
||||
--I don’t have time to test it right now, but I think it will also work without `DeriveAnyClass`, just using `DeriveGeneric` and `StandAloneDeriving`. It should also work to use the [`genericParseJSON`](http://hackage.haskell.org/package/aeson/docs/Data-Aeson.html#v:genericParseJSON) function to implement the class explicitly, something like this:
|
||||
--
|
||||
--{-# LANGUAGE DeriveGeneric #-}
|
||||
--{-# LANGUAGE StandAloneDeriving #-}
|
||||
--import GHC.Generics
|
||||
--import Data.Aeson
|
||||
--deriving instance Generic Decimal
|
||||
--instance FromJSON Decimal where
|
||||
-- parseJSON = genericParseJSON defaultOptions
|
||||
--
|
||||
--And of course you can avoid `StandAloneDeriving` entirely if you’re willing to wrap `Decimal` in your own `newtype`.
|
||||
|
||||
|
||||
-- Utilities
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user