packages feed

flatbuffers-0.4.0.0: src/FlatBuffers/Internal/Compiler/ValidSyntaxTree.hs

module FlatBuffers.Internal.Compiler.ValidSyntaxTree
  ( -- * Re-exports from `FlatBuffers.Internal.Compiler.SyntaxTree`
    FlatBuffers.Internal.Compiler.SyntaxTree.Namespace(..)
  , FlatBuffers.Internal.Compiler.SyntaxTree.Ident(..)
  , FlatBuffers.Internal.Compiler.SyntaxTree.TypeRef(..)
  , FlatBuffers.Internal.Compiler.SyntaxTree.HasIdent(..)
  -- * Enums
  , EnumDecl(..)
  , EnumVal(..)
  , EnumType(..)
  -- * Structs
  , StructDecl(..)
  , StructField(..)
  , StructFieldType(..)
  -- * Tables
  , DefaultVal(..)
  , Required(..)
  , IsRoot(..)
  , TableDecl(..)
  , TableField(..)
  , TableFieldType(..)
  , VectorElementType(..)
  -- * Unions
  , UnionDecl(..)
  , UnionVal(..)
  ) where

import Data.Bits (Bits)
import Data.List.NonEmpty (NonEmpty)
import Data.Scientific (Scientific)
import Data.String (IsString(..))
import Data.Text (Text)
import Data.Word

import FlatBuffers.Internal.Compiler.SyntaxTree
  (HasIdent(..), Ident(..), Namespace(..), TypeRef(..))
import FlatBuffers.Internal.Types

instance HasIdent EnumDecl    where getIdent = enumIdent
instance HasIdent EnumVal     where getIdent = enumValIdent
instance HasIdent StructDecl  where getIdent = structIdent
instance HasIdent StructField where getIdent = structFieldIdent
instance HasIdent TableDecl   where getIdent = tableIdent
instance HasIdent TableField  where getIdent = tableFieldIdent
instance HasIdent UnionDecl   where getIdent = unionIdent
instance HasIdent UnionVal    where getIdent = unionValIdent

----------------------------------
------------- Enums --------------
----------------------------------
data EnumDecl = EnumDecl
  { enumIdent    :: !Ident
  , enumType     :: !EnumType
  , enumBitFlags :: !Bool
  , enumVals     :: !(NonEmpty EnumVal)
  } deriving (Show, Eq)

data EnumVal = EnumVal
  { enumValIdent :: !Ident
  , enumValInt   :: !Integer
  } deriving (Show, Eq)

data EnumType
  = EInt8
  | EInt16
  | EInt32
  | EInt64
  | EWord8
  | EWord16
  | EWord32
  | EWord64
  deriving (Show, Eq)

----------------------------------
------------ Structs -------------
----------------------------------
data StructDecl = StructDecl
  { structIdent     :: !Ident
  , structAlignment :: !Alignment
  , structSize      :: !InlineSize
  , structFields    :: !(NonEmpty StructField)
  } deriving (Show, Eq)

data StructField = StructField
  { structFieldIdent   :: !Ident
  , structFieldPadding :: !Word8  -- ^ How many zeros to write after this field.
  , structFieldOffset  :: !Word16 -- ^ This field's offset from the struct's root.
  , structFieldType    :: !StructFieldType
  } deriving (Show, Eq)

data StructFieldType
  = SInt8
  | SInt16
  | SInt32
  | SInt64
  | SWord8
  | SWord16
  | SWord32
  | SWord64
  | SFloat
  | SDouble
  | SBool
  | SEnum
      !TypeRef
      !EnumType
  | SStruct !(Namespace, StructDecl)
  deriving (Show, Eq)

----------------------------------
------------ Tables --------------
----------------------------------
newtype DefaultVal a = DefaultVal a
  deriving newtype (Eq, Show, Num, IsString, Ord, Enum, Real, Integral, Fractional, Bits)

data Required = Req | Opt
  deriving (Eq, Show)

data IsRoot
  = NotRoot              -- ^ This table is not the root table.
  | IsRoot !(Maybe Text) -- ^ This table is the root table, and has an optional file identifier.
  deriving (Eq, Show)

data TableDecl = TableDecl
  { tableIdent  :: !Ident
  , tableIsRoot :: !IsRoot
  , tableFields :: ![TableField]
  } deriving (Eq, Show)

data TableField = TableField
  { tableFieldId         :: !Integer
  , tableFieldIdent      :: !Ident
  , tableFieldType       :: !TableFieldType
  , tableFieldDeprecated :: !Bool
  } deriving (Eq, Show)

data TableFieldType
  = TInt8   !(DefaultVal Integer)
  | TInt16  !(DefaultVal Integer)
  | TInt32  !(DefaultVal Integer)
  | TInt64  !(DefaultVal Integer)
  | TWord8  !(DefaultVal Integer)
  | TWord16 !(DefaultVal Integer)
  | TWord32 !(DefaultVal Integer)
  | TWord64 !(DefaultVal Integer)
  | TFloat  !(DefaultVal Scientific)
  | TDouble !(DefaultVal Scientific)
  | TBool   !(DefaultVal Bool)
  | TString !Required
  | TEnum   !TypeRef !EnumType !(DefaultVal Integer)
  | TStruct !TypeRef !Required
  | TTable  !TypeRef !Required
  | TUnion  !TypeRef !Required
  | TVector !Required !VectorElementType
  deriving (Eq, Show)

data VectorElementType
  = VInt8
  | VInt16
  | VInt32
  | VInt64
  | VWord8
  | VWord16
  | VWord32
  | VWord64
  | VFloat
  | VDouble
  | VBool
  | VString
  | VEnum   !TypeRef !EnumType
  | VStruct !TypeRef
  | VTable  !TypeRef
  | VUnion  !TypeRef
  deriving (Eq, Show)

----------------------------------
------------ Unions --------------
----------------------------------
data UnionDecl = UnionDecl
  { unionIdent :: !Ident
  , unionVals  :: !(NonEmpty UnionVal)
  } deriving (Show, Eq)

data UnionVal = UnionVal
  { unionValIdent    :: !Ident
  , unionValTableRef :: !TypeRef
  } deriving (Show, Eq)