{-# LANGUAGE ScopedTypeVariables, DeriveDataTypeable,
  OverloadedStrings, DeriveGeneric #-}
module Data.Bond.Schema.StructDef (StructDef(..)) where
import qualified Data.Bond.Internal.Imports as B'
import qualified Prelude as P'
import qualified Data.Bond.Schema.FieldDef
import qualified Data.Bond.Schema.Metadata
import qualified Data.Bond.Schema.TypeDef
import qualified GHC.Generics as P'

data StructDef = StructDef{metadata ::
                           Data.Bond.Schema.Metadata.Metadata,
                           base_def :: B'.Maybe Data.Bond.Schema.TypeDef.TypeDef,
                           fields :: B'.Vector Data.Bond.Schema.FieldDef.FieldDef}
               deriving (P'.Generic, P'.Show, P'.Eq, B'.Typeable)

instance B'.Default StructDef where
        defaultValue
          = StructDef{metadata = B'.defaultValue, base_def = B'.defaultValue,
                      fields = B'.defaultValue}

instance B'.BondType StructDef where
        bondGet = B'.bondGetStruct
        bondPut = B'.bondPutStruct
        getName _ = "StructDef"
        getQualifiedName _ = "bond.StructDef"
        getElementType type'proxy
          = B'.ElementStruct (B'.getSchema type'proxy)

instance B'.BondStruct StructDef where
        bondStructPut self'
          = do B'.bondPutField (B'.Proxy :: B'.Proxy StructDef)
                 (B'.Ordinal 0)
                 (metadata self')
               B'.bondPutField (B'.Proxy :: B'.Proxy StructDef) (B'.Ordinal 1)
                 (base_def self')
               B'.bondPutField (B'.Proxy :: B'.Proxy StructDef) (B'.Ordinal 2)
                 (fields self')
        bondStructGetUntagged
          = P'.return StructDef `B'.ap` B'.bondGet `B'.ap` B'.bondGetNullable
              `B'.ap` B'.bondGet
        bondStructGetBase self' = P'.return self'
        bondStructGetField (B'.Ordinal 0) self'
          = do field'val <- B'.bondGet
               P'.return self'{metadata = field'val}
        bondStructGetField (B'.Ordinal 1) self'
          = do field'val <- B'.bondGet
               P'.return self'{base_def = field'val}
        bondStructGetField (B'.Ordinal 2) self'
          = do field'val <- B'.bondGet
               P'.return self'{fields = field'val}
        bondStructGetField _ _ = P'.error "unknown field ordinal"
        getSchema type'proxy
          = B'.StructSchema{B'.structTag = B'.typeRep type'proxy,
                            B'.structName = B'.getName type'proxy,
                            B'.structQualifiedName = B'.getQualifiedName type'proxy,
                            B'.structAttrs = B'.makeMap [], B'.structBase = P'.Nothing,
                            B'.structFields =
                              B'.makeMap
                                [(B'.Ordinal 0,
                                  B'.FieldSchema{B'.fieldName = "metadata",
                                                 B'.fieldAttrs = B'.makeMap [],
                                                 B'.fieldModifier = B'.FieldOptional,
                                                 B'.fieldType =
                                                   B'.elementToFieldType
                                                     (B'.getElementType
                                                        (B'.Proxy ::
                                                           B'.Proxy
                                                             Data.Bond.Schema.Metadata.Metadata))}),
                                 (B'.Ordinal 1,
                                  B'.FieldSchema{B'.fieldName = "base_def",
                                                 B'.fieldAttrs = B'.makeMap [],
                                                 B'.fieldModifier = B'.FieldOptional,
                                                 B'.fieldType =
                                                   B'.elementToFieldType
                                                     (B'.getElementType
                                                        (B'.Proxy ::
                                                           B'.Proxy
                                                             (B'.Maybe
                                                                Data.Bond.Schema.TypeDef.TypeDef)))}),
                                 (B'.Ordinal 2,
                                  B'.FieldSchema{B'.fieldName = "fields",
                                                 B'.fieldAttrs = B'.makeMap [],
                                                 B'.fieldModifier = B'.FieldOptional,
                                                 B'.fieldType =
                                                   B'.elementToFieldType
                                                     (B'.getElementType
                                                        (B'.Proxy ::
                                                           B'.Proxy
                                                             (B'.Vector
                                                                Data.Bond.Schema.FieldDef.FieldDef)))})],
                            B'.structRequiredOrdinals = B'.fromOrdinalList []}

instance B'.NFData StructDef