module Language.Slice.Syntax.AST
       ( IncludeDelimiters(..)
       , SliceType(..)
       , SliceVal(..)
       , SliceDecl(..)
       -- , DefaultValue(..)
       , Annotation(..)
       , FieldDecl(..)
       , MethodDecl(..)
       , MethodOrFieldDecl(..)
       ) where

data IncludeDelimiters = AngleBrackets | Quotes deriving (Show, Read, Eq)

data SliceType = STVoid 
               | STBool | STByte | STShort | STInt | STLong 
               | STFloat | STDouble 
               | STString 
               | STUserDefined String
               | STUserDefinedPrx String
               deriving (Show, Read, Eq)
                 
data SliceVal = SliceBool Bool
              | SliceStr String
              | SliceInteger Integer
              | SliceDouble Double
              | SliceIdentifier String
              deriving (Show, Read, Eq)

data SliceDecl = ModuleDecl String [SliceDecl]
               | IncludeDecl IncludeDelimiters String
               | EnumDecl String [String]
               | StructDecl String [FieldDecl]
               | ClassDecl String (Maybe String) [MethodOrFieldDecl]
               | InterfaceDecl String [String] [MethodDecl]
               | InterfaceFDecl String
               | SequenceDecl SliceType String
               | DictionaryDecl SliceType SliceType String
               | ExceptionDecl String [String] [FieldDecl]
               | ConstDecl SliceType String SliceVal
               deriving (Show, Read, Eq)

data Annotation = Idempotent deriving (Show, Read, Eq)

data FieldDecl = FieldDecl SliceType String (Maybe SliceVal) deriving (Show, Read, Eq)

data MethodDecl = MethodDecl SliceType String [FieldDecl] [String] (Maybe Annotation) deriving (Show, Read, Eq)

data MethodOrFieldDecl = MDecl MethodDecl | FDecl FieldDecl deriving (Show, Read, Eq)