on dev help sign in
some more progress
e1f631cEitan Chatav
squeal-postgresql/src/Squeal/PostgreSQL/Binary.hs+17−5
@@ -160,7 +160,9 @@ module Squeal.PostgreSQL.Binary
160 , Only (..)
160 , Only (..)
161 ) where
161 ) where
162
162
163+import BinaryParser
163import ByteString.StrictBuilder
164import ByteString.StrictBuilder
165+import Control.Monad
164import Data.Aeson hiding (Null)
166import Data.Aeson hiding (Null)
165import Data.Int
167import Data.Int
166import Data.Kind
168import Data.Kind
@@ -178,7 +180,7 @@ import Network.IP.Addr
178import qualified Data.ByteString.Lazy as Lazy
180import qualified Data.ByteString.Lazy as Lazy
179import qualified Data.ByteString as Strict hiding (pack, unpack)
181import qualified Data.ByteString as Strict hiding (pack, unpack)
180import qualified Data.Text.Lazy as Lazy
182import qualified Data.Text.Lazy as Lazy
181−import qualified Data.Text as Strict
183+import qualified Data.Text as Strict hiding (empty)
182import qualified Data.Vector as Vector
184import qualified Data.Vector as Vector
183import qualified GHC.Generics as GHC
185import qualified GHC.Generics as GHC
184import qualified PostgreSQL.Binary.Decoding as Decoding
186import qualified PostgreSQL.Binary.Decoding as Decoding
@@ -439,10 +441,20 @@ instance
439 fromValue p =
441 fromValue p =
440 let
442 let
441 composite
443 composite
444+ :: forall proxy pgs. SListI pgs
442− :: proxy ('PGcomposite pgs)
445+ => proxy ('PGcomposite pgs)
443 -> Strict.ByteString
446 -> Strict.ByteString
444− -> NP (K (Maybe Strict.ByteString)) pgs
447+ -> Either Strict.Text (NP (K (Maybe Strict.ByteString)) pgs)
445− composite = undefined
448+ composite _ = Decoding.valueParser $ do
449+ unitOfSize 4
450+ let
451+ each _ = do
452+ unitOfSize 4
453+ len <- sized 4 Decoding.int
454+ if len == -1
455+ then return (K Nothing)
456+ else K . Just <$> bytesOfSize len
457+ htraverse' each (hpure Proxy :: NP Proxy pgs)
446
458
447 -- composite
459 -- composite
448 -- :: SListI zs
460 -- :: SListI zs
@@ -474,7 +486,7 @@ instance
474 -- htraverse' each fields
486 -- htraverse' each fields
475
487
476 in
488 in
477− Decoding.fn (fromRow @fields @y . composite p)
489+ Decoding.fn (fromRow @fields @y <=< composite p)
478
490
479-- | A `FromColumnValue` constraint lifts the `FromValue` parser
491-- | A `FromColumnValue` constraint lifts the `FromValue` parser
480-- to a decoding of a @(Symbol, NullityType)@ to a `Type`,
492-- to a decoding of a @(Symbol, NullityType)@ to a `Type`,