avro 0.3.1.2 → 0.3.2.0
raw patch · 2 files changed
+17/−8 lines, 2 files
Files
- avro.cabal +2/−2
- src/Data/Avro/Deriving.hs +15/−6
avro.cabal view
@@ -2,10 +2,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: 6ce25074d44e607f3bbf1f81921a61fe9d8ea37a5cbde2000d26607b4d04d85a+-- hash: a7df532e971306f0e8b7c7ff21ecb95e20f336d396ec72f86154b1df850f7ee7 name: avro-version: 0.3.1.2+version: 0.3.2.0 synopsis: Avro serialization support for Haskell description: Avro serialization and deserialization support for Haskell category: Data
src/Data/Avro/Deriving.hs view
@@ -39,6 +39,7 @@ import Data.Semigroup ((<>)) import GHC.Generics (Generic) import Language.Haskell.TH as TH+import Language.Haskell.TH.Lib as TH import Language.Haskell.TH.Syntax import Data.Avro.Deriving.NormSchema@@ -200,6 +201,9 @@ schema = pure $(varE sname) |] +newNames :: String {- ^ base name -} -> Int {- ^ count -} -> Q [Name]+newNames base n = sequence [ newName (base++show i) | i <- [1..n] ]+ genToAvro :: DeriveOptions -> Schema -> Q [Dec] genToAvro opts s@(Enum n _ _ _ vs _) = toAvroInstance (mkSchemaValueName n)@@ -221,11 +225,15 @@ [d| instance ToAvro $(conT $ mkDataTypeName n) where toAvro = $(genToAvroFieldsExp sname) |]- genToAvroFieldsExp sname = [| \r -> record $(varE sname)- $(let assign fld = [| T.pack $(mkTextLit (fldName fld)) .= $(varE $ mkTextName $ (fieldNameBuilder opts) n fld) r |]- in listE $ assign <$> fs- )- |]+ genToAvroFieldsExp sname = do+ names <- newNames "p_" (length fs)+ let con = conP (mkDataTypeName n) (varP <$> names)+ lamE [con]+ [| record $(varE sname)+ $(let assign (fld, n) = [| T.pack $(mkTextLit (fldName fld)) .= $(varE n) |]+ in listE $ assign <$> zip fs names+ )+ |] genToAvro opts s@(Fixed n _ _ size) = toAvroInstance (mkSchemaValueName n)@@ -244,7 +252,8 @@ x = $(schemaDef' sch) |] -schemaDef' sch = mkSchema sch+schemaDef' :: S.Type -> ExpQ+schemaDef' = mkSchema where mkSchema = \case Null -> [e| Null |] Boolean -> [e| Boolean |]