{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

-- This file is part of the Wire Server implementation.
--
-- Copyright (C) 2022 Wire Swiss GmbH <opensource@wire.com>
--
-- This program is free software: you can redistribute it and/or modify it under
-- the terms of the GNU Affero General Public License as published by the Free
-- Software Foundation, either version 3 of the License, or (at your option) any
-- later version.
--
-- This program is distributed in the hope that it will be useful, but WITHOUT
-- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-- FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
-- details.
--
-- You should have received a copy of the GNU Affero General Public License along
-- with this program. If not, see <https://www.gnu.org/licenses/>.

module Galley.Cassandra.Instances
  (
  )
where

import Cassandra.CQL
import Control.Error (note)
import Data.ByteString.Conversion
import Data.ByteString.Lazy qualified as LBS
import Data.Text qualified as T
import Data.Text.Encoding qualified as T
import Imports
import Wire.API.Bot ()
import Wire.API.Conversation
import Wire.API.Conversation.Protocol
import Wire.API.MLS.CipherSuite
import Wire.API.MLS.GroupInfo
import Wire.API.MLS.Proposal
import Wire.API.MLS.Serialisation
import Wire.API.MLS.SubConversation
import Wire.API.Routes.Internal.Galley.TeamsIntra
import Wire.API.Team
import Wire.API.Team.Feature qualified as Public
import Wire.API.Team.SearchVisibility

deriving instance Cql MutedStatus

deriving instance Cql ReceiptMode

instance Cql ConvType where
  ctype :: Tagged ConvType ColumnType
ctype = ColumnType -> Tagged ConvType ColumnType
forall a b. b -> Tagged a b
Tagged ColumnType
IntColumn

  toCql :: ConvType -> Value
toCql ConvType
RegularConv = Int32 -> Value
CqlInt Int32
0
  toCql ConvType
SelfConv = Int32 -> Value
CqlInt Int32
1
  toCql ConvType
One2OneConv = Int32 -> Value
CqlInt Int32
2
  toCql ConvType
ConnectConv = Int32 -> Value
CqlInt Int32
3

  fromCql :: Value -> Either String ConvType
fromCql (CqlInt Int32
i) = case Int32
i of
    Int32
0 -> ConvType -> Either String ConvType
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ConvType
RegularConv
    Int32
1 -> ConvType -> Either String ConvType
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ConvType
SelfConv
    Int32
2 -> ConvType -> Either String ConvType
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ConvType
One2OneConv
    Int32
3 -> ConvType -> Either String ConvType
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ConvType
ConnectConv
    Int32
n -> String -> Either String ConvType
forall a b. a -> Either a b
Left (String -> Either String ConvType)
-> String -> Either String ConvType
forall a b. (a -> b) -> a -> b
$ String
"unexpected conversation-type: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int32 -> String
forall a. Show a => a -> String
show Int32
n
  fromCql Value
_ = String -> Either String ConvType
forall a b. a -> Either a b
Left String
"conv-type: int expected"

instance Cql Access where
  ctype :: Tagged Access ColumnType
ctype = ColumnType -> Tagged Access ColumnType
forall a b. b -> Tagged a b
Tagged ColumnType
IntColumn

  toCql :: Access -> Value
toCql Access
PrivateAccess = Int32 -> Value
CqlInt Int32
1
  toCql Access
InviteAccess = Int32 -> Value
CqlInt Int32
2
  toCql Access
LinkAccess = Int32 -> Value
CqlInt Int32
3
  toCql Access
CodeAccess = Int32 -> Value
CqlInt Int32
4

  fromCql :: Value -> Either String Access
fromCql (CqlInt Int32
i) = case Int32
i of
    Int32
1 -> Access -> Either String Access
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Access
PrivateAccess
    Int32
2 -> Access -> Either String Access
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Access
InviteAccess
    Int32
3 -> Access -> Either String Access
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Access
LinkAccess
    Int32
4 -> Access -> Either String Access
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Access
CodeAccess
    Int32
n -> String -> Either String Access
forall a b. a -> Either a b
Left (String -> Either String Access) -> String -> Either String Access
forall a b. (a -> b) -> a -> b
$ String
"Unexpected Access value: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int32 -> String
forall a. Show a => a -> String
show Int32
n
  fromCql Value
_ = String -> Either String Access
forall a b. a -> Either a b
Left String
"Access value: int expected"

instance Cql AccessRoleLegacy where
  ctype :: Tagged AccessRoleLegacy ColumnType
ctype = ColumnType -> Tagged AccessRoleLegacy ColumnType
forall a b. b -> Tagged a b
Tagged ColumnType
IntColumn

  toCql :: AccessRoleLegacy -> Value
toCql AccessRoleLegacy
PrivateAccessRole = Int32 -> Value
CqlInt Int32
1
  toCql AccessRoleLegacy
TeamAccessRole = Int32 -> Value
CqlInt Int32
2
  toCql AccessRoleLegacy
ActivatedAccessRole = Int32 -> Value
CqlInt Int32
3
  toCql AccessRoleLegacy
NonActivatedAccessRole = Int32 -> Value
CqlInt Int32
4

  fromCql :: Value -> Either String AccessRoleLegacy
fromCql (CqlInt Int32
i) = case Int32
i of
    Int32
1 -> AccessRoleLegacy -> Either String AccessRoleLegacy
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure AccessRoleLegacy
PrivateAccessRole
    Int32
2 -> AccessRoleLegacy -> Either String AccessRoleLegacy
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure AccessRoleLegacy
TeamAccessRole
    Int32
3 -> AccessRoleLegacy -> Either String AccessRoleLegacy
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure AccessRoleLegacy
ActivatedAccessRole
    Int32
4 -> AccessRoleLegacy -> Either String AccessRoleLegacy
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure AccessRoleLegacy
NonActivatedAccessRole
    Int32
n -> String -> Either String AccessRoleLegacy
forall a b. a -> Either a b
Left (String -> Either String AccessRoleLegacy)
-> String -> Either String AccessRoleLegacy
forall a b. (a -> b) -> a -> b
$ String
"Unexpected AccessRole value: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int32 -> String
forall a. Show a => a -> String
show Int32
n
  fromCql Value
_ = String -> Either String AccessRoleLegacy
forall a b. a -> Either a b
Left String
"AccessRole value: int expected"

instance Cql AccessRole where
  ctype :: Tagged AccessRole ColumnType
ctype = ColumnType -> Tagged AccessRole ColumnType
forall a b. b -> Tagged a b
Tagged ColumnType
IntColumn

  toCql :: AccessRole -> Value
toCql = \case
    AccessRole
TeamMemberAccessRole -> Int32 -> Value
CqlInt Int32
1
    AccessRole
NonTeamMemberAccessRole -> Int32 -> Value
CqlInt Int32
2
    AccessRole
GuestAccessRole -> Int32 -> Value
CqlInt Int32
3
    AccessRole
ServiceAccessRole -> Int32 -> Value
CqlInt Int32
4

  fromCql :: Value -> Either String AccessRole
fromCql (CqlInt Int32
i) = case Int32
i of
    Int32
1 -> AccessRole -> Either String AccessRole
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure AccessRole
TeamMemberAccessRole
    Int32
2 -> AccessRole -> Either String AccessRole
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure AccessRole
NonTeamMemberAccessRole
    Int32
3 -> AccessRole -> Either String AccessRole
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure AccessRole
GuestAccessRole
    Int32
4 -> AccessRole -> Either String AccessRole
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure AccessRole
ServiceAccessRole
    Int32
n -> String -> Either String AccessRole
forall a b. a -> Either a b
Left (String -> Either String AccessRole)
-> String -> Either String AccessRole
forall a b. (a -> b) -> a -> b
$ String
"Unexpected AccessRoleV2 value: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int32 -> String
forall a. Show a => a -> String
show Int32
n
  fromCql Value
_ = String -> Either String AccessRole
forall a b. a -> Either a b
Left String
"AccessRoleV2 value: int expected"

instance Cql ConvTeamInfo where
  ctype :: Tagged ConvTeamInfo ColumnType
ctype = ColumnType -> Tagged ConvTeamInfo ColumnType
forall a b. b -> Tagged a b
Tagged (ColumnType -> Tagged ConvTeamInfo ColumnType)
-> ColumnType -> Tagged ConvTeamInfo ColumnType
forall a b. (a -> b) -> a -> b
$ Text -> [(Text, ColumnType)] -> ColumnType
UdtColumn Text
"teaminfo" [(Text
"teamid", ColumnType
UuidColumn), (Text
"managed", ColumnType
BooleanColumn)]

  toCql :: ConvTeamInfo -> Value
toCql ConvTeamInfo
t = [(Text, Value)] -> Value
CqlUdt [(Text
"teamid", TeamId -> Value
forall a. Cql a => a -> Value
toCql (ConvTeamInfo -> TeamId
cnvTeamId ConvTeamInfo
t)), (Text
"managed", Bool -> Value
forall a. Cql a => a -> Value
toCql Bool
False)]

  fromCql :: Value -> Either String ConvTeamInfo
fromCql (CqlUdt [(Text, Value)]
u) =
    String -> Maybe Value -> Either String Value
forall a b. a -> Maybe b -> Either a b
note String
"missing 'teamid' in teaminfo" (Text
"teamid" Text -> [(Text, Value)] -> Maybe Value
forall a b. Eq a => a -> [(a, b)] -> Maybe b
`lookup` [(Text, Value)]
u) Either String Value
-> (Value -> Either String ConvTeamInfo)
-> Either String ConvTeamInfo
forall a b.
Either String a -> (a -> Either String b) -> Either String b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (TeamId -> ConvTeamInfo)
-> Either String TeamId -> Either String ConvTeamInfo
forall a b. (a -> b) -> Either String a -> Either String b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap TeamId -> ConvTeamInfo
ConvTeamInfo (Either String TeamId -> Either String ConvTeamInfo)
-> (Value -> Either String TeamId)
-> Value
-> Either String ConvTeamInfo
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Either String TeamId
forall a. Cql a => Value -> Either String a
fromCql
  fromCql Value
_ = String -> Either String ConvTeamInfo
forall a b. a -> Either a b
Left String
"teaminfo: udt expected"

instance Cql TeamBinding where
  ctype :: Tagged TeamBinding ColumnType
ctype = ColumnType -> Tagged TeamBinding ColumnType
forall a b. b -> Tagged a b
Tagged ColumnType
BooleanColumn

  toCql :: TeamBinding -> Value
toCql TeamBinding
Binding = Bool -> Value
CqlBoolean Bool
True
  toCql TeamBinding
NonBinding = Bool -> Value
CqlBoolean Bool
False

  fromCql :: Value -> Either String TeamBinding
fromCql (CqlBoolean Bool
True) = TeamBinding -> Either String TeamBinding
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure TeamBinding
Binding
  fromCql (CqlBoolean Bool
False) = TeamBinding -> Either String TeamBinding
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure TeamBinding
NonBinding
  fromCql Value
_ = String -> Either String TeamBinding
forall a b. a -> Either a b
Left String
"teambinding: boolean expected"

instance Cql TeamStatus where
  ctype :: Tagged TeamStatus ColumnType
ctype = ColumnType -> Tagged TeamStatus ColumnType
forall a b. b -> Tagged a b
Tagged ColumnType
IntColumn

  toCql :: TeamStatus -> Value
toCql TeamStatus
Active = Int32 -> Value
CqlInt Int32
0
  toCql TeamStatus
PendingDelete = Int32 -> Value
CqlInt Int32
1
  toCql TeamStatus
Deleted = Int32 -> Value
CqlInt Int32
2
  toCql TeamStatus
Suspended = Int32 -> Value
CqlInt Int32
3
  toCql TeamStatus
PendingActive = Int32 -> Value
CqlInt Int32
4

  fromCql :: Value -> Either String TeamStatus
fromCql (CqlInt Int32
i) = case Int32
i of
    Int32
0 -> TeamStatus -> Either String TeamStatus
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure TeamStatus
Active
    Int32
1 -> TeamStatus -> Either String TeamStatus
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure TeamStatus
PendingDelete
    Int32
2 -> TeamStatus -> Either String TeamStatus
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure TeamStatus
Deleted
    Int32
3 -> TeamStatus -> Either String TeamStatus
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure TeamStatus
Suspended
    Int32
4 -> TeamStatus -> Either String TeamStatus
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure TeamStatus
PendingActive
    Int32
n -> String -> Either String TeamStatus
forall a b. a -> Either a b
Left (String -> Either String TeamStatus)
-> String -> Either String TeamStatus
forall a b. (a -> b) -> a -> b
$ String
"unexpected team-status: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int32 -> String
forall a. Show a => a -> String
show Int32
n
  fromCql Value
_ = String -> Either String TeamStatus
forall a b. a -> Either a b
Left String
"team-status: int expected"

instance Cql TeamSearchVisibility where
  ctype :: Tagged TeamSearchVisibility ColumnType
ctype = ColumnType -> Tagged TeamSearchVisibility ColumnType
forall a b. b -> Tagged a b
Tagged ColumnType
IntColumn

  fromCql :: Value -> Either String TeamSearchVisibility
fromCql (CqlInt Int32
n) = case Int32
n of
    Int32
0 -> TeamSearchVisibility -> Either String TeamSearchVisibility
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (TeamSearchVisibility -> Either String TeamSearchVisibility)
-> TeamSearchVisibility -> Either String TeamSearchVisibility
forall a b. (a -> b) -> a -> b
$ TeamSearchVisibility
SearchVisibilityStandard
    Int32
1 -> TeamSearchVisibility -> Either String TeamSearchVisibility
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (TeamSearchVisibility -> Either String TeamSearchVisibility)
-> TeamSearchVisibility -> Either String TeamSearchVisibility
forall a b. (a -> b) -> a -> b
$ TeamSearchVisibility
SearchVisibilityNoNameOutsideTeam
    Int32
_ -> String -> Either String TeamSearchVisibility
forall a b. a -> Either a b
Left String
"fromCql: Invalid TeamSearchVisibility"
  fromCql Value
_ = String -> Either String TeamSearchVisibility
forall a b. a -> Either a b
Left String
"fromCql: TeamSearchVisibility: CqlInt expected"

  toCql :: TeamSearchVisibility -> Value
toCql TeamSearchVisibility
SearchVisibilityStandard = Int32 -> Value
CqlInt Int32
0
  toCql TeamSearchVisibility
SearchVisibilityNoNameOutsideTeam = Int32 -> Value
CqlInt Int32
1

instance Cql Public.EnforceAppLock where
  ctype :: Tagged EnforceAppLock ColumnType
ctype = ColumnType -> Tagged EnforceAppLock ColumnType
forall a b. b -> Tagged a b
Tagged ColumnType
IntColumn
  toCql :: EnforceAppLock -> Value
toCql (Public.EnforceAppLock Bool
False) = Int32 -> Value
CqlInt Int32
0
  toCql (Public.EnforceAppLock Bool
True) = Int32 -> Value
CqlInt Int32
1
  fromCql :: Value -> Either String EnforceAppLock
fromCql (CqlInt Int32
n) = case Int32
n of
    Int32
0 -> EnforceAppLock -> Either String EnforceAppLock
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Bool -> EnforceAppLock
Public.EnforceAppLock Bool
False)
    Int32
1 -> EnforceAppLock -> Either String EnforceAppLock
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Bool -> EnforceAppLock
Public.EnforceAppLock Bool
True)
    Int32
_ -> String -> Either String EnforceAppLock
forall a b. a -> Either a b
Left String
"fromCql EnforceAppLock: int out of range"
  fromCql Value
_ = String -> Either String EnforceAppLock
forall a b. a -> Either a b
Left String
"fromCql EnforceAppLock: int expected"

instance Cql ProtocolTag where
  ctype :: Tagged ProtocolTag ColumnType
ctype = ColumnType -> Tagged ProtocolTag ColumnType
forall a b. b -> Tagged a b
Tagged ColumnType
IntColumn

  toCql :: ProtocolTag -> Value
toCql = Int32 -> Value
CqlInt (Int32 -> Value) -> (ProtocolTag -> Int32) -> ProtocolTag -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Int32) -> (ProtocolTag -> Int) -> ProtocolTag -> Int32
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ProtocolTag -> Int
forall a. Enum a => a -> Int
fromEnum

  fromCql :: Value -> Either String ProtocolTag
fromCql (CqlInt Int32
i) = do
    let i' :: Int
i' = Int32 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int32
i
    if Int
i' Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< forall a. Enum a => a -> Int
fromEnum @ProtocolTag ProtocolTag
forall a. Bounded a => a
minBound
      Bool -> Bool -> Bool
|| Int
i' Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> forall a. Enum a => a -> Int
fromEnum @ProtocolTag ProtocolTag
forall a. Bounded a => a
maxBound
      then String -> Either String ProtocolTag
forall a b. a -> Either a b
Left (String -> Either String ProtocolTag)
-> String -> Either String ProtocolTag
forall a b. (a -> b) -> a -> b
$ String
"unexpected protocol: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int32 -> String
forall a. Show a => a -> String
show Int32
i
      else ProtocolTag -> Either String ProtocolTag
forall a b. b -> Either a b
Right (ProtocolTag -> Either String ProtocolTag)
-> ProtocolTag -> Either String ProtocolTag
forall a b. (a -> b) -> a -> b
$ Int -> ProtocolTag
forall a. Enum a => Int -> a
toEnum Int
i'
  fromCql Value
_ = String -> Either String ProtocolTag
forall a b. a -> Either a b
Left String
"protocol: int expected"

instance Cql GroupId where
  ctype :: Tagged GroupId ColumnType
ctype = ColumnType -> Tagged GroupId ColumnType
forall a b. b -> Tagged a b
Tagged ColumnType
BlobColumn

  toCql :: GroupId -> Value
toCql = ByteString -> Value
CqlBlob (ByteString -> Value)
-> (GroupId -> ByteString) -> GroupId -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
LBS.fromStrict (ByteString -> ByteString)
-> (GroupId -> ByteString) -> GroupId -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GroupId -> ByteString
unGroupId

  fromCql :: Value -> Either String GroupId
fromCql (CqlBlob ByteString
b) = GroupId -> Either String GroupId
forall a b. b -> Either a b
Right (GroupId -> Either String GroupId)
-> (ByteString -> GroupId) -> ByteString -> Either String GroupId
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> GroupId
GroupId (ByteString -> GroupId)
-> (ByteString -> ByteString) -> ByteString -> GroupId
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
LBS.toStrict (ByteString -> Either String GroupId)
-> ByteString -> Either String GroupId
forall a b. (a -> b) -> a -> b
$ ByteString
b
  fromCql Value
_ = String -> Either String GroupId
forall a b. a -> Either a b
Left String
"group_id: blob expected"

instance Cql GroupInfoData where
  ctype :: Tagged GroupInfoData ColumnType
ctype = ColumnType -> Tagged GroupInfoData ColumnType
forall a b. b -> Tagged a b
Tagged ColumnType
BlobColumn

  toCql :: GroupInfoData -> Value
toCql = ByteString -> Value
CqlBlob (ByteString -> Value)
-> (GroupInfoData -> ByteString) -> GroupInfoData -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
LBS.fromStrict (ByteString -> ByteString)
-> (GroupInfoData -> ByteString) -> GroupInfoData -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GroupInfoData -> ByteString
unGroupInfoData
  fromCql :: Value -> Either String GroupInfoData
fromCql (CqlBlob ByteString
b) = GroupInfoData -> Either String GroupInfoData
forall a b. b -> Either a b
Right (GroupInfoData -> Either String GroupInfoData)
-> GroupInfoData -> Either String GroupInfoData
forall a b. (a -> b) -> a -> b
$ ByteString -> GroupInfoData
GroupInfoData (ByteString -> ByteString
LBS.toStrict ByteString
b)
  fromCql Value
_ = String -> Either String GroupInfoData
forall a b. a -> Either a b
Left String
"GroupInfoData: blob expected"

instance Cql Icon where
  ctype :: Tagged Icon ColumnType
ctype = ColumnType -> Tagged Icon ColumnType
forall a b. b -> Tagged a b
Tagged ColumnType
TextColumn
  toCql :: Icon -> Value
toCql = Text -> Value
CqlText (Text -> Value) -> (Icon -> Text) -> Icon -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Text
T.decodeUtf8 (ByteString -> Text) -> (Icon -> ByteString) -> Icon -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Icon -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString'
  fromCql :: Value -> Either String Icon
fromCql (CqlText Text
txt) = Icon -> Either String Icon
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Icon -> Either String Icon)
-> (Text -> Icon) -> Text -> Either String Icon
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Icon -> Either String Icon -> Icon
forall b a. b -> Either a b -> b
fromRight Icon
DefaultIcon (Either String Icon -> Icon)
-> (Text -> Either String Icon) -> Text -> Icon
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Parser Icon -> ByteString -> Either String Icon
forall a. Parser a -> ByteString -> Either String a
runParser Parser Icon
forall a. FromByteString a => Parser a
parser (ByteString -> Either String Icon)
-> (Text -> ByteString) -> Text -> Either String Icon
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> ByteString
T.encodeUtf8 (Text -> Either String Icon) -> Text -> Either String Icon
forall a b. (a -> b) -> a -> b
$ Text
txt
  fromCql Value
_ = String -> Either String Icon
forall a b. a -> Either a b
Left String
"Icon: Text expected"

instance Cql Epoch where
  ctype :: Tagged Epoch ColumnType
ctype = ColumnType -> Tagged Epoch ColumnType
forall a b. b -> Tagged a b
Tagged ColumnType
BigIntColumn
  toCql :: Epoch -> Value
toCql = Int64 -> Value
CqlBigInt (Int64 -> Value) -> (Epoch -> Int64) -> Epoch -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> Int64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Int64) -> (Epoch -> Word64) -> Epoch -> Int64
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Epoch -> Word64
epochNumber
  fromCql :: Value -> Either String Epoch
fromCql (CqlBigInt Int64
n) = Epoch -> Either String Epoch
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Word64 -> Epoch
Epoch (Int64 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int64
n))
  fromCql Value
_ = String -> Either String Epoch
forall a b. a -> Either a b
Left String
"epoch: bigint expected"

instance Cql ProposalRef where
  ctype :: Tagged ProposalRef ColumnType
ctype = ColumnType -> Tagged ProposalRef ColumnType
forall a b. b -> Tagged a b
Tagged ColumnType
BlobColumn
  toCql :: ProposalRef -> Value
toCql = ByteString -> Value
CqlBlob (ByteString -> Value)
-> (ProposalRef -> ByteString) -> ProposalRef -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
LBS.fromStrict (ByteString -> ByteString)
-> (ProposalRef -> ByteString) -> ProposalRef -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ProposalRef -> ByteString
unProposalRef
  fromCql :: Value -> Either String ProposalRef
fromCql (CqlBlob ByteString
b) = ProposalRef -> Either String ProposalRef
forall a b. b -> Either a b
Right (ProposalRef -> Either String ProposalRef)
-> (ByteString -> ProposalRef)
-> ByteString
-> Either String ProposalRef
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ProposalRef
ProposalRef (ByteString -> ProposalRef)
-> (ByteString -> ByteString) -> ByteString -> ProposalRef
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
LBS.toStrict (ByteString -> Either String ProposalRef)
-> ByteString -> Either String ProposalRef
forall a b. (a -> b) -> a -> b
$ ByteString
b
  fromCql Value
_ = String -> Either String ProposalRef
forall a b. a -> Either a b
Left String
"ProposalRef: blob expected"

instance Cql (RawMLS Proposal) where
  ctype :: Tagged (RawMLS Proposal) ColumnType
ctype = ColumnType -> Tagged (RawMLS Proposal) ColumnType
forall a b. b -> Tagged a b
Tagged ColumnType
BlobColumn
  toCql :: RawMLS Proposal -> Value
toCql = ByteString -> Value
CqlBlob (ByteString -> Value)
-> (RawMLS Proposal -> ByteString) -> RawMLS Proposal -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
LBS.fromStrict (ByteString -> ByteString)
-> (RawMLS Proposal -> ByteString) -> RawMLS Proposal -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RawMLS Proposal -> ByteString
forall a. RawMLS a -> ByteString
raw
  fromCql :: Value -> Either String (RawMLS Proposal)
fromCql (CqlBlob ByteString
b) = (Text -> String)
-> Either Text (RawMLS Proposal) -> Either String (RawMLS Proposal)
forall a c b. (a -> c) -> Either a b -> Either c b
mapLeft Text -> String
T.unpack (Either Text (RawMLS Proposal) -> Either String (RawMLS Proposal))
-> Either Text (RawMLS Proposal) -> Either String (RawMLS Proposal)
forall a b. (a -> b) -> a -> b
$ ByteString -> Either Text (RawMLS Proposal)
forall a. ParseMLS a => ByteString -> Either Text a
decodeMLS ByteString
b
  fromCql Value
_ = String -> Either String (RawMLS Proposal)
forall a b. a -> Either a b
Left String
"Proposal: blob expected"

instance Cql CipherSuite where
  ctype :: Tagged CipherSuite ColumnType
ctype = ColumnType -> Tagged CipherSuite ColumnType
forall a b. b -> Tagged a b
Tagged ColumnType
IntColumn
  toCql :: CipherSuite -> Value
toCql = Int32 -> Value
CqlInt (Int32 -> Value) -> (CipherSuite -> Int32) -> CipherSuite -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word16 -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16 -> Int32)
-> (CipherSuite -> Word16) -> CipherSuite -> Int32
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CipherSuite -> Word16
cipherSuiteNumber
  fromCql :: Value -> Either String CipherSuite
fromCql (CqlInt Int32
i) =
    if Int32
i Int32 -> Int32 -> Bool
forall a. Ord a => a -> a -> Bool
< Int32
2 Int32 -> Integer -> Int32
forall a b. (Num a, Integral b) => a -> b -> a
^ (Integer
16 :: Integer)
      then CipherSuite -> Either String CipherSuite
forall a b. b -> Either a b
Right (CipherSuite -> Either String CipherSuite)
-> (Int32 -> CipherSuite) -> Int32 -> Either String CipherSuite
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word16 -> CipherSuite
CipherSuite (Word16 -> CipherSuite)
-> (Int32 -> Word16) -> Int32 -> CipherSuite
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int32 -> Word16
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int32 -> Either String CipherSuite)
-> Int32 -> Either String CipherSuite
forall a b. (a -> b) -> a -> b
$ Int32
i
      else String -> Either String CipherSuite
forall a b. a -> Either a b
Left String
"CipherSuite: an out of bounds value for Word16"
  fromCql Value
_ = String -> Either String CipherSuite
forall a b. a -> Either a b
Left String
"CipherSuite: int expected"

instance Cql SubConvId where
  ctype :: Tagged SubConvId ColumnType
ctype = ColumnType -> Tagged SubConvId ColumnType
forall a b. b -> Tagged a b
Tagged ColumnType
TextColumn
  toCql :: SubConvId -> Value
toCql = Text -> Value
CqlText (Text -> Value) -> (SubConvId -> Text) -> SubConvId -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SubConvId -> Text
unSubConvId
  fromCql :: Value -> Either String SubConvId
fromCql (CqlText Text
txt) = SubConvId -> Either String SubConvId
forall a b. b -> Either a b
Right (Text -> SubConvId
SubConvId Text
txt)
  fromCql Value
_ = String -> Either String SubConvId
forall a b. a -> Either a b
Left String
"SubConvId: Text expected"