module Language.Thrift.Types
( Program(..)
, Header(..)
, Definition(..)
, Type(..)
, FieldRequiredness(..)
, Field(..)
, EnumDef(..)
, ConstValue(..)
, FieldType(..)
, Function(..)
, TypeAnnotation(..)
, Docstring
) where
import Data.Data (Data, Typeable)
import Data.Text (Text)
import GHC.Generics (Generic)
data Program srcAnnot = Program
{ programHeaders :: [Header]
, programDefinitions :: [Definition srcAnnot]
}
deriving (Show, Ord, Eq, Data, Typeable, Generic)
data Header
= Include { includePath :: Text }
| Namespace { namespaceLanguage, namespaceName :: Text }
deriving (Show, Ord, Eq, Data, Typeable, Generic)
data Definition srcAnnot
= ConstDefinition
{ constType :: FieldType
, constName :: Text
, constValue :: ConstValue
, constDocstring :: Docstring
, constSrcAnnot :: srcAnnot
}
| TypeDefinition
{ typeDefinition :: Type srcAnnot
, typeAnnotations :: [TypeAnnotation]
}
| ServiceDefinition
{ serviceName :: Text
, serviceExtends :: Maybe Text
, serviceFunctions :: [Function srcAnnot]
, serviceAnnotations :: [TypeAnnotation]
, serviceDocstring :: Docstring
, serviceSrcAnnot :: srcAnnot
}
deriving (Show, Ord, Eq, Data, Typeable, Generic)
data Type srcAnnot
= Typedef
{ typedefType :: FieldType
, typedefName :: Text
, typedefDocstring :: Docstring
, typedefSrcAnnot :: srcAnnot
}
| Enum
{ enumName :: Text
, enumValues :: [EnumDef srcAnnot]
, enumDocstring :: Docstring
, enumSrcAnnot :: srcAnnot
}
| Struct
{ structName :: Text
, structFields :: [Field srcAnnot]
, structDocstring :: Docstring
, structSrcAnnot :: srcAnnot
}
| Union
{ unionName :: Text
, unionFields :: [Field srcAnnot]
, unionDocstring :: Docstring
, unionSrcAnnot :: srcAnnot
}
| Exception
{ exceptionName :: Text
, exceptionFields :: [Field srcAnnot]
, exceptionDocstring :: Docstring
, exceptionSrcAnnot :: srcAnnot
}
| Senum
{ senumName :: Text
, senumValues :: [Text]
, senumDocstring :: Docstring
, senumSrcAnnot :: srcAnnot
}
deriving (Show, Ord, Eq, Data, Typeable, Generic)
data FieldRequiredness = Required | Optional
deriving (Show, Ord, Eq, Data, Typeable, Generic)
data Field srcAnnot = Field
{ fieldIdentifier :: Maybe Integer
, fieldRequiredNess :: Maybe FieldRequiredness
, fieldType :: FieldType
, fieldName :: Text
, fieldDefault :: Maybe ConstValue
, fieldAnnotations :: [TypeAnnotation]
, fieldDocstring :: Docstring
, fieldSrcAnnot :: srcAnnot
}
deriving (Show, Ord, Eq, Data, Typeable, Generic)
data EnumDef srcAnnot = EnumDef
{ enumDefName :: Text
, enumDefValue :: Maybe Integer
, enumDefAnnotations :: [TypeAnnotation]
, enumDefDocstring :: Docstring
, enumDefSrcAnnot :: srcAnnot
}
deriving (Show, Ord, Eq, Data, Typeable, Generic)
data ConstValue
= ConstInt Integer
| ConstFloat Double
| ConstLiteral Text
| ConstIdentifier Text
| ConstList [ConstValue]
| ConstMap [(ConstValue, ConstValue)]
deriving (Show, Ord, Eq, Data, Typeable, Generic)
data FieldType
= DefinedType Text
| StringType [TypeAnnotation]
| BinaryType [TypeAnnotation]
| SListType [TypeAnnotation]
| BoolType [TypeAnnotation]
| ByteType [TypeAnnotation]
| I16Type [TypeAnnotation]
| I32Type [TypeAnnotation]
| I64Type [TypeAnnotation]
| DoubleType [TypeAnnotation]
| MapType FieldType FieldType [TypeAnnotation]
| SetType FieldType [TypeAnnotation]
| ListType FieldType [TypeAnnotation]
deriving (Show, Ord, Eq, Data, Typeable, Generic)
data Function srcAnnot = Function
{ functionOneWay :: Bool
, functionReturnType :: Maybe FieldType
, functionName :: Text
, functionParameters :: [Field srcAnnot]
, functionExceptions :: Maybe [Field srcAnnot]
, functionAnnotations :: [TypeAnnotation]
, functionDocstring :: Docstring
, functionSrcAnnot :: srcAnnot
}
deriving (Show, Ord, Eq, Data, Typeable, Generic)
data TypeAnnotation = TypeAnnotation
{ typeAnnotationName :: Text
, typeAnnotationValue :: Text
}
deriving (Show, Ord, Eq, Data, Typeable, Generic)
type Docstring = Maybe Text