safe-money-xmlbf 0.1.1 → 0.1.2
raw patch · 4 files changed
+52/−15 lines, 4 filesdep ~xmlbfPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: xmlbf
API changes (from Hackage documentation)
Files
- changelog.md +5/−0
- safe-money-xmlbf.cabal +2/−2
- src/Money/Xmlbf.hs +18/−10
- test/Main.hs +27/−3
changelog.md view
@@ -1,3 +1,8 @@+# Version 0.1.2++* Require `xmlbf>=0.5`.++ # Version 0.1.1 * Require `safe-money>=0.8`.
safe-money-xmlbf.cabal view
@@ -1,5 +1,5 @@ name: safe-money-xmlbf-version: 0.1.1+version: 0.1.2 license: BSD3 license-file: LICENSE copyright: Copyright (c) Renzo Carbonara 2016-2018@@ -34,7 +34,7 @@ base (>=4.8 && <5.0), safe-money >=0.8, text,- xmlbf+ xmlbf >=0.5 exposed-modules: Money.Xmlbf
src/Money/Xmlbf.hs view
@@ -22,7 +22,15 @@ import GHC.TypeLits (KnownSymbol) import qualified Money import qualified Xmlbf+import qualified Data.Text.Read as TR +pRead :: Integral a => TR.Reader a -> T.Text -> Xmlbf.Parser a+{-# INLINE pRead #-}+pRead rdr txt = case rdr txt of+ Right (a, "") -> pure a+ Right _ -> fail "Money.Xmblbf.pRead: did not match fully."+ Left err -> fail err+ -------------------------------------------------------------------------------- -- | Compatible with 'Money.SomeDense'@@ -46,14 +54,14 @@ as = [ (T.pack "c", Money.someDenseCurrency sd) , (T.pack "n", T.pack (show (numerator r))) , (T.pack "d", T.pack (show (denominator r))) ]- in [ Xmlbf.element' (T.pack "money-dense") (fromList as) [] ]+ in [ either error id (Xmlbf.element' "money-dense" (fromList as) []) ] -- | Compatible with 'Money.Dense'. instance Xmlbf.FromXml Money.SomeDense where fromXml = Xmlbf.pElement (T.pack "money-dense") $ do c <- Xmlbf.pAttr "c"- n <- Xmlbf.pRead =<< Xmlbf.pAttr "n"- d <- Xmlbf.pRead =<< Xmlbf.pAttr "d"+ n <- pRead (TR.signed TR.decimal) =<< Xmlbf.pAttr "n"+ d <- pRead TR.decimal =<< Xmlbf.pAttr "d" when (d == 0) (fail "denominator is zero") maybe empty pure (Money.mkSomeDense c (n % d)) @@ -83,16 +91,16 @@ , ("n", T.pack (show (numerator r))) , ("d", T.pack (show (denominator r))) , ("a", T.pack (show (Money.someDiscreteAmount sd))) ]- in [ Xmlbf.element' (T.pack "money-discrete") (fromList as) [] ]+ in [ either error id (Xmlbf.element' "money-discrete" (fromList as) []) ] -- | Compatible with 'Money.Discrete'' instance Xmlbf.FromXml Money.SomeDiscrete where fromXml = Xmlbf.pElement (T.pack "money-discrete") $ do c <- Xmlbf.pAttr "c"- n <- Xmlbf.pRead =<< Xmlbf.pAttr "n"- d <- Xmlbf.pRead =<< Xmlbf.pAttr "d"+ n <- pRead TR.decimal =<< Xmlbf.pAttr "n"+ d <- pRead TR.decimal =<< Xmlbf.pAttr "d" when (d == 0) (fail "denominator is zero")- a <- Xmlbf.pRead =<< Xmlbf.pAttr "a"+ a <- pRead (TR.signed TR.decimal) =<< Xmlbf.pAttr "a" maybe empty pure (Money.mkSomeDiscrete c <$> Money.scaleFromRational (n % d) <*> pure a) @@ -123,15 +131,15 @@ , ("dst", Money.someExchangeRateDstCurrency ser) , ("n", T.pack (show (numerator r))) , ("d", T.pack (show (denominator r))) ]- in [ Xmlbf.element' (T.pack "exchange-rate") (fromList as) [] ]+ in [ either error id (Xmlbf.element' "exchange-rate" (fromList as) []) ] -- | Compatible with 'Money.ExchangeRate' instance Xmlbf.FromXml Money.SomeExchangeRate where fromXml = Xmlbf.pElement (T.pack "exchange-rate") $ do src <- Xmlbf.pAttr "src" dst <- Xmlbf.pAttr "dst"- n <- Xmlbf.pRead =<< Xmlbf.pAttr "n"- d <- Xmlbf.pRead =<< Xmlbf.pAttr "d"+ n <- pRead TR.decimal =<< Xmlbf.pAttr "n"+ d <- pRead TR.decimal =<< Xmlbf.pAttr "d" when (d == 0) (fail "denominator is zero") maybe empty pure (Money.mkSomeExchangeRate src dst (n % d))
test/Main.hs view
@@ -171,14 +171,20 @@ [ Tasty.testGroup "decode" [ HU.testCase "Dense" $ do Right rawDns0 @=? Xmlbf.runParser Xmlbf.fromXml rawDns0_xmlbf+ , HU.testCase "Dense (negative)" $ do+ Right rawDns1 @=? Xmlbf.runParser Xmlbf.fromXml rawDns1_xmlbf , HU.testCase "Discrete" $ do Right rawDis0 @=? Xmlbf.runParser Xmlbf.fromXml rawDis0_xmlbf+ , HU.testCase "Discrete (negative)" $ do+ Right rawDis1 @=? Xmlbf.runParser Xmlbf.fromXml rawDis1_xmlbf , HU.testCase "ExchangeRate" $ do Right rawXr0 @=? Xmlbf.runParser Xmlbf.fromXml rawXr0_xmlbf ] , Tasty.testGroup "encode" [ HU.testCase "Dense" $ rawDns0_xmlbf @=? Xmlbf.toXml rawDns0+ , HU.testCase "Dense (negative)" $ rawDns1_xmlbf @=? Xmlbf.toXml rawDns1 , HU.testCase "Discrete" $ rawDis0_xmlbf @=? Xmlbf.toXml rawDis0+ , HU.testCase "Discrete (negative)" $ rawDis1_xmlbf @=? Xmlbf.toXml rawDis1 , HU.testCase "ExchangeRate" $ rawXr0_xmlbf @=? Xmlbf.toXml rawXr0 ] ]@@ -187,20 +193,38 @@ rawDns0 :: Money.Dense "USD" rawDns0 = Money.dense' (26%1) +rawDns1 :: Money.Dense "USD"+rawDns1 = Money.dense' (negate 26 % 1)+ rawDis0 :: Money.Discrete "USD" "cent" rawDis0 = Money.discrete 4 +rawDis1 :: Money.Discrete "USD" "cent"+rawDis1 = Money.discrete (negate 4)++ rawXr0 :: Money.ExchangeRate "USD" "BTC" Just rawXr0 = Money.exchangeRate (3%2) rawDns0_xmlbf :: [Xmlbf.Node] rawDns0_xmlbf = -- "<money-dense n=\"26\" d=\"1\" c=\"USD\"/>"- [ Xmlbf.element' "money-dense" (fromList [("n","26"), ("d","1"), ("c","USD")]) [] ]+ [ either error id $ Xmlbf.element' "money-dense" (fromList [("n","26"), ("d","1"), ("c","USD")]) [] ]++rawDns1_xmlbf :: [Xmlbf.Node]+rawDns1_xmlbf = -- "<money-dense n=\"-26\" d=\"1\" c=\"USD\"/>"+ [ either error id $ Xmlbf.element' "money-dense" (fromList [("n","-26"), ("d","1"), ("c","USD")]) [] ]+ rawDis0_xmlbf :: [Xmlbf.Node] rawDis0_xmlbf = -- "<money-discrete n=\"100\" a=\"4\" d=\"1\" c=\"USD\"/>"- [ Xmlbf.element' "money-discrete" (fromList [("n","100"), ("d","1"), ("c","USD"), ("a","4")]) [] ]+ [ either error id $ Xmlbf.element' "money-discrete" (fromList [("n","100"), ("d","1"), ("c","USD"), ("a","4")]) [] ]++rawDis1_xmlbf :: [Xmlbf.Node]+rawDis1_xmlbf = -- "<money-discrete n=\"100\" a=\"-4\" d=\"1\" c=\"USD\"/>"+ [ either error id $ Xmlbf.element' "money-discrete" (fromList [("n","100"), ("d","1"), ("c","USD"), ("a","-4")]) [] ]++ rawXr0_xmlbf :: [Xmlbf.Node] rawXr0_xmlbf = -- "<exchange-rate dst=\"BTC\" n=\"3\" d=\"2\" src=\"USD\"/>"- [ Xmlbf.element' "exchange-rate" (fromList [("n","3"), ("d","2"), ("src","USD"), ("dst","BTC")]) [] ]+ [ either error id $ Xmlbf.element' "exchange-rate" (fromList [("n","3"), ("d","2"), ("src","USD"), ("dst","BTC")]) [] ]