blockfrost-api-0.1.0.0: src/Blockfrost/Types/Shared/Ada.hs
-- | Lovelaces
{-# LANGUAGE NumericUnderscores #-}
{-# LANGUAGE UndecidableInstances #-}
module Blockfrost.Types.Shared.Ada
( Lovelaces
) where
import Data.Aeson (Encoding, FromJSON (..), ToJSON (..), Value)
import Data.Proxy (Proxy (..))
import Data.Text (Text)
import GHC.TypeLits (KnownSymbol)
import qualified Money
import Servant.Docs (ToSample (..), samples)
type Lovelaces = Money.Discrete "ADA" "lovelace"
instance (KnownSymbol cur, Money.GoodScale sc) => ToSample (Money.Discrete' cur sc) where
toSamples _ = samples $ map Money.discrete [
592661
, 3592661
, 1337
, 42
, 0
, 3000100
]
lovelaceDecimalConfig :: Money.DecimalConf
lovelaceDecimalConfig =
Money.defaultDecimalConf
{ Money.decimalConf_digits = 0
, Money.decimalConf_scale =
Money.scale (Proxy @(Money.UnitScale "ADA" "lovelace"))
}
instance ToJSON (Money.Discrete' "ADA" '(1_000_000, 1)) where
toJSON =
(toJSON :: Text -> Value)
. Money.discreteToDecimal
lovelaceDecimalConfig
Money.Round
toEncoding =
(toEncoding :: Text -> Encoding)
. Money.discreteToDecimal
lovelaceDecimalConfig
Money.Round
instance FromJSON (Money.Discrete' "ADA" '(1000000, 1)) where
parseJSON v = do
t <- parseJSON v
maybe
(fail "Can't parse Discrete ADA value")
pure
(Money.discreteFromDecimal lovelaceDecimalConfig t)