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

data Variant = Variant{uint_value :: B'.Word64,
                       int_value :: B'.Int64, double_value :: B'.Double,
                       string_value :: B'.Utf8, wstring_value :: B'.Utf16,
                       nothing :: B'.Bool}
             deriving (P'.Generic, P'.Show, P'.Eq, B'.Typeable)

instance B'.Default Variant where
        defaultValue
          = Variant{uint_value = B'.defaultValue,
                    int_value = B'.defaultValue, double_value = B'.defaultValue,
                    string_value = B'.defaultValue, wstring_value = B'.defaultValue,
                    nothing = B'.defaultValue}

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

instance B'.BondStruct Variant where
        bondStructPut self'
          = do B'.bondPutField (B'.Proxy :: B'.Proxy Variant) (B'.Ordinal 0)
                 (uint_value self')
               B'.bondPutField (B'.Proxy :: B'.Proxy Variant) (B'.Ordinal 1)
                 (int_value self')
               B'.bondPutField (B'.Proxy :: B'.Proxy Variant) (B'.Ordinal 2)
                 (double_value self')
               B'.bondPutField (B'.Proxy :: B'.Proxy Variant) (B'.Ordinal 3)
                 (string_value self')
               B'.bondPutField (B'.Proxy :: B'.Proxy Variant) (B'.Ordinal 4)
                 (wstring_value self')
               B'.bondPutField (B'.Proxy :: B'.Proxy Variant) (B'.Ordinal 5)
                 (nothing self')
        bondStructGetUntagged
          = P'.return Variant `B'.ap` B'.bondGet `B'.ap` B'.bondGet `B'.ap`
              B'.bondGet
              `B'.ap` B'.bondGet
              `B'.ap` B'.bondGet
              `B'.ap` B'.bondGet
        bondStructGetBase self' = P'.return self'
        bondStructGetField (B'.Ordinal 0) self'
          = do field'val <- B'.bondGet
               P'.return self'{uint_value = field'val}
        bondStructGetField (B'.Ordinal 1) self'
          = do field'val <- B'.bondGet
               P'.return self'{int_value = field'val}
        bondStructGetField (B'.Ordinal 2) self'
          = do field'val <- B'.bondGet
               P'.return self'{double_value = field'val}
        bondStructGetField (B'.Ordinal 3) self'
          = do field'val <- B'.bondGet
               P'.return self'{string_value = field'val}
        bondStructGetField (B'.Ordinal 4) self'
          = do field'val <- B'.bondGet
               P'.return self'{wstring_value = field'val}
        bondStructGetField (B'.Ordinal 5) self'
          = do field'val <- B'.bondGet
               P'.return self'{nothing = 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 = "uint_value",
                                                 B'.fieldAttrs = B'.makeMap [],
                                                 B'.fieldModifier = B'.FieldOptional,
                                                 B'.fieldType =
                                                   B'.FieldUInt64
                                                     (B'.DefaultValue
                                                        (uint_value
                                                           (B'.defaultValue `B'.asProxyTypeOf`
                                                              type'proxy)))}),
                                 (B'.Ordinal 1,
                                  B'.FieldSchema{B'.fieldName = "int_value",
                                                 B'.fieldAttrs = B'.makeMap [],
                                                 B'.fieldModifier = B'.FieldOptional,
                                                 B'.fieldType =
                                                   B'.FieldInt64
                                                     (B'.DefaultValue
                                                        (int_value
                                                           (B'.defaultValue `B'.asProxyTypeOf`
                                                              type'proxy)))}),
                                 (B'.Ordinal 2,
                                  B'.FieldSchema{B'.fieldName = "double_value",
                                                 B'.fieldAttrs = B'.makeMap [],
                                                 B'.fieldModifier = B'.FieldOptional,
                                                 B'.fieldType =
                                                   B'.FieldDouble
                                                     (B'.DefaultValue
                                                        (double_value
                                                           (B'.defaultValue `B'.asProxyTypeOf`
                                                              type'proxy)))}),
                                 (B'.Ordinal 3,
                                  B'.FieldSchema{B'.fieldName = "string_value",
                                                 B'.fieldAttrs = B'.makeMap [],
                                                 B'.fieldModifier = B'.FieldOptional,
                                                 B'.fieldType =
                                                   B'.FieldString
                                                     (B'.DefaultValue
                                                        (string_value
                                                           (B'.defaultValue `B'.asProxyTypeOf`
                                                              type'proxy)))}),
                                 (B'.Ordinal 4,
                                  B'.FieldSchema{B'.fieldName = "wstring_value",
                                                 B'.fieldAttrs = B'.makeMap [],
                                                 B'.fieldModifier = B'.FieldOptional,
                                                 B'.fieldType =
                                                   B'.FieldWString
                                                     (B'.DefaultValue
                                                        (wstring_value
                                                           (B'.defaultValue `B'.asProxyTypeOf`
                                                              type'proxy)))}),
                                 (B'.Ordinal 5,
                                  B'.FieldSchema{B'.fieldName = "nothing",
                                                 B'.fieldAttrs = B'.makeMap [],
                                                 B'.fieldModifier = B'.FieldOptional,
                                                 B'.fieldType =
                                                   B'.FieldBool
                                                     (B'.DefaultValue
                                                        (nothing
                                                           (B'.defaultValue `B'.asProxyTypeOf`
                                                              type'proxy)))})],
                            B'.structRequiredOrdinals = B'.fromOrdinalList []}

instance B'.NFData Variant