]> git.proxmox.com Git - ceph.git/blame - ceph/src/jaegertracing/thrift/lib/hs/src/Thrift/Types.hs
buildsys: switch source download to quincy
[ceph.git] / ceph / src / jaegertracing / thrift / lib / hs / src / Thrift / Types.hs
CommitLineData
f67539c2
TL
1-- Licensed to the Apache Software Foundation (ASF) under one
2-- or more contributor license agreements. See the NOTICE file
3-- distributed with this work for additional information
4-- regarding copyright ownership. The ASF licenses this file
5-- to you under the Apache License, Version 2.0 (the
6-- "License"); you may not use this file except in compliance
7-- with the License. You may obtain a copy of the License at
8--
9-- http://www.apache.org/licenses/LICENSE-2.0
10--
11-- Unless required by applicable law or agreed to in writing,
12-- software distributed under the License is distributed on an
13-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14-- KIND, either express or implied. See the License for the
15-- specific language governing permissions and limitations
16-- under the License.
17--
18
19{-# OPTIONS_GHC -fno-warn-orphans #-}
20
21module Thrift.Types where
22
23import Data.Foldable (foldl')
24import Data.Hashable ( Hashable, hashWithSalt )
25import Data.Int
26import Test.QuickCheck.Arbitrary
27import Test.QuickCheck.Gen (elements)
28import Data.Text.Lazy (Text)
29import qualified Data.ByteString.Lazy as LBS
30import qualified Data.HashMap.Strict as Map
31import qualified Data.HashSet as Set
32import qualified Data.Vector as Vector
33
34instance (Hashable a) => Hashable (Vector.Vector a) where
35 hashWithSalt = Vector.foldl' hashWithSalt
36
37
38type TypeMap = Map.HashMap Int16 (Text, ThriftType)
39
40data ThriftVal = TStruct (Map.HashMap Int16 (Text, ThriftVal))
41 | TMap ThriftType ThriftType [(ThriftVal, ThriftVal)]
42 | TList ThriftType [ThriftVal]
43 | TSet ThriftType [ThriftVal]
44 | TBool Bool
45 | TByte Int8
46 | TI16 Int16
47 | TI32 Int32
48 | TI64 Int64
49 | TString LBS.ByteString
50 | TBinary LBS.ByteString
51 | TDouble Double
52 deriving (Eq, Show)
53
54-- Information is needed here for collection types (ie T_STRUCT, T_MAP,
55-- T_LIST, and T_SET) so that we know what types those collections are
56-- parameterized by. In most protocols, this cannot be discerned directly
57-- from the data being read.
58data ThriftType
59 = T_STOP
60 | T_VOID
61 | T_BOOL
62 | T_BYTE
63 | T_DOUBLE
64 | T_I16
65 | T_I32
66 | T_I64
67 | T_STRING
68 | T_BINARY
69 | T_STRUCT TypeMap
70 | T_MAP ThriftType ThriftType
71 | T_SET ThriftType
72 | T_LIST ThriftType
73 deriving ( Eq, Show )
74
75-- NOTE: when using toEnum information about parametized types is NOT preserved.
76-- This design choice is consistent woth the Thrift implementation in other
77-- languages
78instance Enum ThriftType where
79 fromEnum T_STOP = 0
80 fromEnum T_VOID = 1
81 fromEnum T_BOOL = 2
82 fromEnum T_BYTE = 3
83 fromEnum T_DOUBLE = 4
84 fromEnum T_I16 = 6
85 fromEnum T_I32 = 8
86 fromEnum T_I64 = 10
87 fromEnum T_STRING = 11
88 fromEnum T_BINARY = 11
89 fromEnum (T_STRUCT _) = 12
90 fromEnum (T_MAP _ _) = 13
91 fromEnum (T_SET _) = 14
92 fromEnum (T_LIST _) = 15
93
94 toEnum 0 = T_STOP
95 toEnum 1 = T_VOID
96 toEnum 2 = T_BOOL
97 toEnum 3 = T_BYTE
98 toEnum 4 = T_DOUBLE
99 toEnum 6 = T_I16
100 toEnum 8 = T_I32
101 toEnum 10 = T_I64
102 toEnum 11 = T_STRING
103 -- toEnum 11 = T_BINARY
104 toEnum 12 = T_STRUCT Map.empty
105 toEnum 13 = T_MAP T_VOID T_VOID
106 toEnum 14 = T_SET T_VOID
107 toEnum 15 = T_LIST T_VOID
108 toEnum t = error $ "Invalid ThriftType " ++ show t
109
110data MessageType
111 = M_CALL
112 | M_REPLY
113 | M_EXCEPTION
114 | M_ONEWAY
115 deriving ( Eq, Show )
116
117instance Enum MessageType where
118 fromEnum M_CALL = 1
119 fromEnum M_REPLY = 2
120 fromEnum M_EXCEPTION = 3
121 fromEnum M_ONEWAY = 4
122
123 toEnum 1 = M_CALL
124 toEnum 2 = M_REPLY
125 toEnum 3 = M_EXCEPTION
126 toEnum 4 = M_ONEWAY
127 toEnum t = error $ "Invalid MessageType " ++ show t
128
129instance Arbitrary MessageType where
130 arbitrary = elements [M_CALL, M_REPLY, M_EXCEPTION, M_ONEWAY]