diff --git a/rds-data.cabal b/rds-data.cabal index bfcb273..faae7d5 100644 --- a/rds-data.cabal +++ b/rds-data.cabal @@ -118,6 +118,7 @@ library codecs Data.RdsData.Aws Data.RdsData.Decode.Array Data.RdsData.Decode.Row + Data.RdsData.Decode.ToRows Data.RdsData.Decode.Value Data.RdsData.Default Data.RdsData.Encode.Array diff --git a/src/Data/RdsData/Decode/Row.hs b/src/Data/RdsData/Decode/Row.hs index 335f5cb..03c1df3 100644 --- a/src/Data/RdsData/Decode/Row.hs +++ b/src/Data/RdsData/Decode/Row.hs @@ -5,6 +5,7 @@ module Data.RdsData.Decode.Row ( DecodeRow(..) + , ToRows(..) , integer , int , int8 @@ -55,6 +56,7 @@ import Prelude hiding (maybe) import qualified Data.Aeson as J import qualified Data.ByteString.Lazy as LBS +import Data.RdsData.Decode.ToRows import qualified Data.RdsData.Decode.Value as DV import qualified Data.RdsData.Internal.Convert as CONV import qualified Data.Text as T @@ -62,7 +64,7 @@ import qualified Data.Text.Lazy as LT import qualified Data.UUID as UUID newtype DecodeRow a = DecodeRow - { unDecodeRow :: ExceptT Text (StateT [Value] Identity) a + { run :: ExceptT Text (StateT [Value] Identity) a } deriving (Applicative, Functor, Monad, MonadState [Value], MonadError Text) @@ -225,7 +227,7 @@ ignore = void $ column DV.rdsValue decodeRow :: DecodeRow a -> [Value] -> Either Text a -decodeRow r = evalState (runExceptT r.unDecodeRow) +decodeRow r = evalState (runExceptT r.run) -decodeRows :: DecodeRow a -> [[Value]] -> Either Text [a] -decodeRows r = traverse (decodeRow r) +decodeRows :: ToRows res => DecodeRow a -> res -> Either Text [a] +decodeRows r = traverse (decodeRow r) . toRows diff --git a/src/Data/RdsData/Decode/ToRows.hs b/src/Data/RdsData/Decode/ToRows.hs new file mode 100644 index 0000000..1971020 --- /dev/null +++ b/src/Data/RdsData/Decode/ToRows.hs @@ -0,0 +1,19 @@ +module Data.RdsData.Decode.ToRows + ( ToRows(..) + ) where + +import qualified Amazonka.RDSData as AWS +import Data.Generics.Product.Any +import Data.Maybe +import Data.RdsData.Types +import Lens.Micro ((^.)) + +class ToRows a where + toRows :: a -> [[Value]] + +instance ToRows [[Value]] where + toRows = id + +instance ToRows AWS.ExecuteStatementResponse where + toRows res = + fromMaybe [] $ mapM (mapM fromField) =<< res ^. the @"records"