-- 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 Wire.API.Team.Export (TeamExportUser (..), quoted, unquoted) where

import Data.Aeson qualified as A
import Data.Aeson qualified as Aeson
import Data.Attoparsec.ByteString.Lazy (parseOnly)
import Data.ByteString.Char8 qualified as C
import Data.ByteString.Conversion (FromByteString (..), ToByteString, toByteString')
import Data.Csv (DefaultOrdered (..), FromNamedRecord (..), Parser, ToNamedRecord (..), namedRecord, (.:))
import Data.Handle (Handle)
import Data.Id (UserId)
import Data.Json.Util (UTCTimeMillis, utcTimeSchema)
import Data.Misc (HttpsUrl)
import Data.OpenApi qualified as OpenApi
import Data.Schema
import Data.Text qualified as T
import Data.Text.Encoding qualified as T
import Data.Time.Clock
import Data.Time.Format
import Data.Vector (fromList)
import Imports
import Test.QuickCheck
import Wire.API.Team.Role (Role)
import Wire.API.User (AccountStatus (..), Name)
import Wire.API.User.Identity (EmailAddress)
import Wire.API.User.Profile (ManagedBy)
import Wire.API.User.RichInfo (RichInfo)
import Wire.Arbitrary

timestampFormat :: String
timestampFormat :: String
timestampFormat = String
"%Y-%m-%d"

data TeamExportUser = TeamExportUser
  { TeamExportUser -> Name
tExportDisplayName :: Name,
    TeamExportUser -> Maybe Handle
tExportHandle :: Maybe Handle,
    TeamExportUser -> Maybe EmailAddress
tExportEmail :: Maybe EmailAddress,
    TeamExportUser -> Maybe Role
tExportRole :: Maybe Role,
    TeamExportUser -> Maybe UTCTimeMillis
tExportCreatedOn :: Maybe UTCTimeMillis,
    TeamExportUser -> Maybe Handle
tExportInvitedBy :: Maybe Handle,
    TeamExportUser -> Maybe HttpsUrl
tExportIdpIssuer :: Maybe HttpsUrl,
    TeamExportUser -> ManagedBy
tExportManagedBy :: ManagedBy,
    TeamExportUser -> Text
tExportSAMLNamedId :: Text, -- If SAML IdP and SCIM peer are set up correctly, 'tExportSAMLNamedId' and 'tExportSCIMExternalId' always align.
    TeamExportUser -> Text
tExportSCIMExternalId :: Text,
    TeamExportUser -> Maybe RichInfo
tExportSCIMRichInfo :: Maybe RichInfo,
    TeamExportUser -> UserId
tExportUserId :: UserId,
    TeamExportUser -> Int
tExportNumDevices :: Int,
    TeamExportUser -> Maybe UTCTime
tExportLastActive :: Maybe UTCTime,
    TeamExportUser -> Maybe AccountStatus
tExportStatus :: Maybe AccountStatus
  }
  deriving (Int -> TeamExportUser -> ShowS
[TeamExportUser] -> ShowS
TeamExportUser -> String
(Int -> TeamExportUser -> ShowS)
-> (TeamExportUser -> String)
-> ([TeamExportUser] -> ShowS)
-> Show TeamExportUser
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TeamExportUser -> ShowS
showsPrec :: Int -> TeamExportUser -> ShowS
$cshow :: TeamExportUser -> String
show :: TeamExportUser -> String
$cshowList :: [TeamExportUser] -> ShowS
showList :: [TeamExportUser] -> ShowS
Show, TeamExportUser -> TeamExportUser -> Bool
(TeamExportUser -> TeamExportUser -> Bool)
-> (TeamExportUser -> TeamExportUser -> Bool) -> Eq TeamExportUser
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: TeamExportUser -> TeamExportUser -> Bool
== :: TeamExportUser -> TeamExportUser -> Bool
$c/= :: TeamExportUser -> TeamExportUser -> Bool
/= :: TeamExportUser -> TeamExportUser -> Bool
Eq, (forall x. TeamExportUser -> Rep TeamExportUser x)
-> (forall x. Rep TeamExportUser x -> TeamExportUser)
-> Generic TeamExportUser
forall x. Rep TeamExportUser x -> TeamExportUser
forall x. TeamExportUser -> Rep TeamExportUser x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. TeamExportUser -> Rep TeamExportUser x
from :: forall x. TeamExportUser -> Rep TeamExportUser x
$cto :: forall x. Rep TeamExportUser x -> TeamExportUser
to :: forall x. Rep TeamExportUser x -> TeamExportUser
Generic)
  deriving (Gen TeamExportUser
Gen TeamExportUser
-> (TeamExportUser -> [TeamExportUser]) -> Arbitrary TeamExportUser
TeamExportUser -> [TeamExportUser]
forall a. Gen a -> (a -> [a]) -> Arbitrary a
$carbitrary :: Gen TeamExportUser
arbitrary :: Gen TeamExportUser
$cshrink :: TeamExportUser -> [TeamExportUser]
shrink :: TeamExportUser -> [TeamExportUser]
Arbitrary) via (GenericUniform TeamExportUser)
  deriving ([TeamExportUser] -> Value
[TeamExportUser] -> Encoding
TeamExportUser -> Value
TeamExportUser -> Encoding
(TeamExportUser -> Value)
-> (TeamExportUser -> Encoding)
-> ([TeamExportUser] -> Value)
-> ([TeamExportUser] -> Encoding)
-> ToJSON TeamExportUser
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
$ctoJSON :: TeamExportUser -> Value
toJSON :: TeamExportUser -> Value
$ctoEncoding :: TeamExportUser -> Encoding
toEncoding :: TeamExportUser -> Encoding
$ctoJSONList :: [TeamExportUser] -> Value
toJSONList :: [TeamExportUser] -> Value
$ctoEncodingList :: [TeamExportUser] -> Encoding
toEncodingList :: [TeamExportUser] -> Encoding
A.ToJSON, Value -> Parser [TeamExportUser]
Value -> Parser TeamExportUser
(Value -> Parser TeamExportUser)
-> (Value -> Parser [TeamExportUser]) -> FromJSON TeamExportUser
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
$cparseJSON :: Value -> Parser TeamExportUser
parseJSON :: Value -> Parser TeamExportUser
$cparseJSONList :: Value -> Parser [TeamExportUser]
parseJSONList :: Value -> Parser [TeamExportUser]
A.FromJSON, Typeable TeamExportUser
Typeable TeamExportUser =>
(Proxy TeamExportUser -> Declare (Definitions Schema) NamedSchema)
-> ToSchema TeamExportUser
Proxy TeamExportUser -> Declare (Definitions Schema) NamedSchema
forall a.
Typeable a =>
(Proxy a -> Declare (Definitions Schema) NamedSchema) -> ToSchema a
$cdeclareNamedSchema :: Proxy TeamExportUser -> Declare (Definitions Schema) NamedSchema
declareNamedSchema :: Proxy TeamExportUser -> Declare (Definitions Schema) NamedSchema
OpenApi.ToSchema) via (Schema TeamExportUser)

instance ToSchema TeamExportUser where
  schema :: ValueSchema NamedSwaggerDoc TeamExportUser
schema =
    Text
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser TeamExportUser
-> ValueSchema NamedSwaggerDoc TeamExportUser
forall doc doc' a b.
HasObject doc doc' =>
Text
-> SchemaP doc Object [Pair] a b -> SchemaP doc' Value Value a b
object Text
"TeamExportUser" (SchemaP SwaggerDoc Object [Pair] TeamExportUser TeamExportUser
 -> ValueSchema NamedSwaggerDoc TeamExportUser)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser TeamExportUser
-> ValueSchema NamedSwaggerDoc TeamExportUser
forall a b. (a -> b) -> a -> b
$
      Name
-> Maybe Handle
-> Maybe EmailAddress
-> Maybe Role
-> Maybe UTCTimeMillis
-> Maybe Handle
-> Maybe HttpsUrl
-> ManagedBy
-> Text
-> Text
-> Maybe RichInfo
-> UserId
-> Int
-> Maybe UTCTime
-> Maybe AccountStatus
-> TeamExportUser
TeamExportUser
        (Name
 -> Maybe Handle
 -> Maybe EmailAddress
 -> Maybe Role
 -> Maybe UTCTimeMillis
 -> Maybe Handle
 -> Maybe HttpsUrl
 -> ManagedBy
 -> Text
 -> Text
 -> Maybe RichInfo
 -> UserId
 -> Int
 -> Maybe UTCTime
 -> Maybe AccountStatus
 -> TeamExportUser)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser Name
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     TeamExportUser
     (Maybe Handle
      -> Maybe EmailAddress
      -> Maybe Role
      -> Maybe UTCTimeMillis
      -> Maybe Handle
      -> Maybe HttpsUrl
      -> ManagedBy
      -> Text
      -> Text
      -> Maybe RichInfo
      -> UserId
      -> Int
      -> Maybe UTCTime
      -> Maybe AccountStatus
      -> TeamExportUser)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TeamExportUser -> Name
tExportDisplayName (TeamExportUser -> Name)
-> SchemaP SwaggerDoc Object [Pair] Name Name
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser Name
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= Text
-> SchemaP NamedSwaggerDoc Value Value Name Name
-> SchemaP SwaggerDoc Object [Pair] Name Name
forall doc' doc a b.
HasField doc' doc =>
Text
-> SchemaP doc' Value Value a b -> SchemaP doc Object [Pair] a b
field Text
"display_name" SchemaP NamedSwaggerDoc Value Value Name Name
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema
        SchemaP
  SwaggerDoc
  Object
  [Pair]
  TeamExportUser
  (Maybe Handle
   -> Maybe EmailAddress
   -> Maybe Role
   -> Maybe UTCTimeMillis
   -> Maybe Handle
   -> Maybe HttpsUrl
   -> ManagedBy
   -> Text
   -> Text
   -> Maybe RichInfo
   -> UserId
   -> Int
   -> Maybe UTCTime
   -> Maybe AccountStatus
   -> TeamExportUser)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser (Maybe Handle)
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     TeamExportUser
     (Maybe EmailAddress
      -> Maybe Role
      -> Maybe UTCTimeMillis
      -> Maybe Handle
      -> Maybe HttpsUrl
      -> ManagedBy
      -> Text
      -> Text
      -> Maybe RichInfo
      -> UserId
      -> Int
      -> Maybe UTCTime
      -> Maybe AccountStatus
      -> TeamExportUser)
forall a b.
SchemaP SwaggerDoc Object [Pair] TeamExportUser (a -> b)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser a
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TeamExportUser -> Maybe Handle
tExportHandle (TeamExportUser -> Maybe Handle)
-> SchemaP SwaggerDoc Object [Pair] (Maybe Handle) (Maybe Handle)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser (Maybe Handle)
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= SchemaP SwaggerDoc Object [Pair] Handle (Maybe Handle)
-> SchemaP SwaggerDoc Object [Pair] (Maybe Handle) (Maybe Handle)
forall w d v a b.
Monoid w =>
SchemaP d v w a b -> SchemaP d v w (Maybe a) b
maybe_ (Text
-> SchemaP NamedSwaggerDoc Value Value Handle Handle
-> SchemaP SwaggerDoc Object [Pair] Handle (Maybe Handle)
forall doc doc' a b.
(HasOpt doc, HasField doc' doc) =>
Text
-> SchemaP doc' Value Value a b
-> SchemaP doc Object [Pair] a (Maybe b)
optField Text
"handle" SchemaP NamedSwaggerDoc Value Value Handle Handle
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema)
        SchemaP
  SwaggerDoc
  Object
  [Pair]
  TeamExportUser
  (Maybe EmailAddress
   -> Maybe Role
   -> Maybe UTCTimeMillis
   -> Maybe Handle
   -> Maybe HttpsUrl
   -> ManagedBy
   -> Text
   -> Text
   -> Maybe RichInfo
   -> UserId
   -> Int
   -> Maybe UTCTime
   -> Maybe AccountStatus
   -> TeamExportUser)
-> SchemaP
     SwaggerDoc Object [Pair] TeamExportUser (Maybe EmailAddress)
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     TeamExportUser
     (Maybe Role
      -> Maybe UTCTimeMillis
      -> Maybe Handle
      -> Maybe HttpsUrl
      -> ManagedBy
      -> Text
      -> Text
      -> Maybe RichInfo
      -> UserId
      -> Int
      -> Maybe UTCTime
      -> Maybe AccountStatus
      -> TeamExportUser)
forall a b.
SchemaP SwaggerDoc Object [Pair] TeamExportUser (a -> b)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser a
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TeamExportUser -> Maybe EmailAddress
tExportEmail (TeamExportUser -> Maybe EmailAddress)
-> SchemaP
     SwaggerDoc Object [Pair] (Maybe EmailAddress) (Maybe EmailAddress)
-> SchemaP
     SwaggerDoc Object [Pair] TeamExportUser (Maybe EmailAddress)
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= SchemaP SwaggerDoc Object [Pair] EmailAddress (Maybe EmailAddress)
-> SchemaP
     SwaggerDoc Object [Pair] (Maybe EmailAddress) (Maybe EmailAddress)
forall w d v a b.
Monoid w =>
SchemaP d v w a b -> SchemaP d v w (Maybe a) b
maybe_ (Text
-> SchemaP NamedSwaggerDoc Value Value EmailAddress EmailAddress
-> SchemaP
     SwaggerDoc Object [Pair] EmailAddress (Maybe EmailAddress)
forall doc doc' a b.
(HasOpt doc, HasField doc' doc) =>
Text
-> SchemaP doc' Value Value a b
-> SchemaP doc Object [Pair] a (Maybe b)
optField Text
"email" SchemaP NamedSwaggerDoc Value Value EmailAddress EmailAddress
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema)
        SchemaP
  SwaggerDoc
  Object
  [Pair]
  TeamExportUser
  (Maybe Role
   -> Maybe UTCTimeMillis
   -> Maybe Handle
   -> Maybe HttpsUrl
   -> ManagedBy
   -> Text
   -> Text
   -> Maybe RichInfo
   -> UserId
   -> Int
   -> Maybe UTCTime
   -> Maybe AccountStatus
   -> TeamExportUser)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser (Maybe Role)
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     TeamExportUser
     (Maybe UTCTimeMillis
      -> Maybe Handle
      -> Maybe HttpsUrl
      -> ManagedBy
      -> Text
      -> Text
      -> Maybe RichInfo
      -> UserId
      -> Int
      -> Maybe UTCTime
      -> Maybe AccountStatus
      -> TeamExportUser)
forall a b.
SchemaP SwaggerDoc Object [Pair] TeamExportUser (a -> b)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser a
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TeamExportUser -> Maybe Role
tExportRole (TeamExportUser -> Maybe Role)
-> SchemaP SwaggerDoc Object [Pair] (Maybe Role) (Maybe Role)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser (Maybe Role)
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= SchemaP SwaggerDoc Object [Pair] Role (Maybe Role)
-> SchemaP SwaggerDoc Object [Pair] (Maybe Role) (Maybe Role)
forall w d v a b.
Monoid w =>
SchemaP d v w a b -> SchemaP d v w (Maybe a) b
maybe_ (Text
-> SchemaP NamedSwaggerDoc Value Value Role Role
-> SchemaP SwaggerDoc Object [Pair] Role (Maybe Role)
forall doc doc' a b.
(HasOpt doc, HasField doc' doc) =>
Text
-> SchemaP doc' Value Value a b
-> SchemaP doc Object [Pair] a (Maybe b)
optField Text
"role" SchemaP NamedSwaggerDoc Value Value Role Role
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema)
        SchemaP
  SwaggerDoc
  Object
  [Pair]
  TeamExportUser
  (Maybe UTCTimeMillis
   -> Maybe Handle
   -> Maybe HttpsUrl
   -> ManagedBy
   -> Text
   -> Text
   -> Maybe RichInfo
   -> UserId
   -> Int
   -> Maybe UTCTime
   -> Maybe AccountStatus
   -> TeamExportUser)
-> SchemaP
     SwaggerDoc Object [Pair] TeamExportUser (Maybe UTCTimeMillis)
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     TeamExportUser
     (Maybe Handle
      -> Maybe HttpsUrl
      -> ManagedBy
      -> Text
      -> Text
      -> Maybe RichInfo
      -> UserId
      -> Int
      -> Maybe UTCTime
      -> Maybe AccountStatus
      -> TeamExportUser)
forall a b.
SchemaP SwaggerDoc Object [Pair] TeamExportUser (a -> b)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser a
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TeamExportUser -> Maybe UTCTimeMillis
tExportCreatedOn (TeamExportUser -> Maybe UTCTimeMillis)
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     (Maybe UTCTimeMillis)
     (Maybe UTCTimeMillis)
-> SchemaP
     SwaggerDoc Object [Pair] TeamExportUser (Maybe UTCTimeMillis)
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= SchemaP
  SwaggerDoc Object [Pair] UTCTimeMillis (Maybe UTCTimeMillis)
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     (Maybe UTCTimeMillis)
     (Maybe UTCTimeMillis)
forall w d v a b.
Monoid w =>
SchemaP d v w a b -> SchemaP d v w (Maybe a) b
maybe_ (Text
-> SchemaP NamedSwaggerDoc Value Value UTCTimeMillis UTCTimeMillis
-> SchemaP
     SwaggerDoc Object [Pair] UTCTimeMillis (Maybe UTCTimeMillis)
forall doc doc' a b.
(HasOpt doc, HasField doc' doc) =>
Text
-> SchemaP doc' Value Value a b
-> SchemaP doc Object [Pair] a (Maybe b)
optField Text
"created_on" SchemaP NamedSwaggerDoc Value Value UTCTimeMillis UTCTimeMillis
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema)
        SchemaP
  SwaggerDoc
  Object
  [Pair]
  TeamExportUser
  (Maybe Handle
   -> Maybe HttpsUrl
   -> ManagedBy
   -> Text
   -> Text
   -> Maybe RichInfo
   -> UserId
   -> Int
   -> Maybe UTCTime
   -> Maybe AccountStatus
   -> TeamExportUser)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser (Maybe Handle)
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     TeamExportUser
     (Maybe HttpsUrl
      -> ManagedBy
      -> Text
      -> Text
      -> Maybe RichInfo
      -> UserId
      -> Int
      -> Maybe UTCTime
      -> Maybe AccountStatus
      -> TeamExportUser)
forall a b.
SchemaP SwaggerDoc Object [Pair] TeamExportUser (a -> b)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser a
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TeamExportUser -> Maybe Handle
tExportInvitedBy (TeamExportUser -> Maybe Handle)
-> SchemaP SwaggerDoc Object [Pair] (Maybe Handle) (Maybe Handle)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser (Maybe Handle)
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= SchemaP SwaggerDoc Object [Pair] Handle (Maybe Handle)
-> SchemaP SwaggerDoc Object [Pair] (Maybe Handle) (Maybe Handle)
forall w d v a b.
Monoid w =>
SchemaP d v w a b -> SchemaP d v w (Maybe a) b
maybe_ (Text
-> SchemaP NamedSwaggerDoc Value Value Handle Handle
-> SchemaP SwaggerDoc Object [Pair] Handle (Maybe Handle)
forall doc doc' a b.
(HasOpt doc, HasField doc' doc) =>
Text
-> SchemaP doc' Value Value a b
-> SchemaP doc Object [Pair] a (Maybe b)
optField Text
"invited_by" SchemaP NamedSwaggerDoc Value Value Handle Handle
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema)
        SchemaP
  SwaggerDoc
  Object
  [Pair]
  TeamExportUser
  (Maybe HttpsUrl
   -> ManagedBy
   -> Text
   -> Text
   -> Maybe RichInfo
   -> UserId
   -> Int
   -> Maybe UTCTime
   -> Maybe AccountStatus
   -> TeamExportUser)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser (Maybe HttpsUrl)
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     TeamExportUser
     (ManagedBy
      -> Text
      -> Text
      -> Maybe RichInfo
      -> UserId
      -> Int
      -> Maybe UTCTime
      -> Maybe AccountStatus
      -> TeamExportUser)
forall a b.
SchemaP SwaggerDoc Object [Pair] TeamExportUser (a -> b)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser a
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TeamExportUser -> Maybe HttpsUrl
tExportIdpIssuer (TeamExportUser -> Maybe HttpsUrl)
-> SchemaP
     SwaggerDoc Object [Pair] (Maybe HttpsUrl) (Maybe HttpsUrl)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser (Maybe HttpsUrl)
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= SchemaP SwaggerDoc Object [Pair] HttpsUrl (Maybe HttpsUrl)
-> SchemaP
     SwaggerDoc Object [Pair] (Maybe HttpsUrl) (Maybe HttpsUrl)
forall w d v a b.
Monoid w =>
SchemaP d v w a b -> SchemaP d v w (Maybe a) b
maybe_ (Text
-> SchemaP NamedSwaggerDoc Value Value HttpsUrl HttpsUrl
-> SchemaP SwaggerDoc Object [Pair] HttpsUrl (Maybe HttpsUrl)
forall doc doc' a b.
(HasOpt doc, HasField doc' doc) =>
Text
-> SchemaP doc' Value Value a b
-> SchemaP doc Object [Pair] a (Maybe b)
optField Text
"idp_issuer" SchemaP NamedSwaggerDoc Value Value HttpsUrl HttpsUrl
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema)
        SchemaP
  SwaggerDoc
  Object
  [Pair]
  TeamExportUser
  (ManagedBy
   -> Text
   -> Text
   -> Maybe RichInfo
   -> UserId
   -> Int
   -> Maybe UTCTime
   -> Maybe AccountStatus
   -> TeamExportUser)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser ManagedBy
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     TeamExportUser
     (Text
      -> Text
      -> Maybe RichInfo
      -> UserId
      -> Int
      -> Maybe UTCTime
      -> Maybe AccountStatus
      -> TeamExportUser)
forall a b.
SchemaP SwaggerDoc Object [Pair] TeamExportUser (a -> b)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser a
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TeamExportUser -> ManagedBy
tExportManagedBy (TeamExportUser -> ManagedBy)
-> SchemaP SwaggerDoc Object [Pair] ManagedBy ManagedBy
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser ManagedBy
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= Text
-> SchemaP NamedSwaggerDoc Value Value ManagedBy ManagedBy
-> SchemaP SwaggerDoc Object [Pair] ManagedBy ManagedBy
forall doc' doc a b.
HasField doc' doc =>
Text
-> SchemaP doc' Value Value a b -> SchemaP doc Object [Pair] a b
field Text
"managed_by" SchemaP NamedSwaggerDoc Value Value ManagedBy ManagedBy
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema
        SchemaP
  SwaggerDoc
  Object
  [Pair]
  TeamExportUser
  (Text
   -> Text
   -> Maybe RichInfo
   -> UserId
   -> Int
   -> Maybe UTCTime
   -> Maybe AccountStatus
   -> TeamExportUser)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser Text
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     TeamExportUser
     (Text
      -> Maybe RichInfo
      -> UserId
      -> Int
      -> Maybe UTCTime
      -> Maybe AccountStatus
      -> TeamExportUser)
forall a b.
SchemaP SwaggerDoc Object [Pair] TeamExportUser (a -> b)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser a
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TeamExportUser -> Text
tExportSAMLNamedId (TeamExportUser -> Text)
-> SchemaP SwaggerDoc Object [Pair] Text Text
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser Text
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= Text
-> SchemaP NamedSwaggerDoc Value Value Text Text
-> SchemaP SwaggerDoc Object [Pair] Text Text
forall doc' doc a b.
HasField doc' doc =>
Text
-> SchemaP doc' Value Value a b -> SchemaP doc Object [Pair] a b
field Text
"saml_name_id" SchemaP NamedSwaggerDoc Value Value Text Text
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema
        SchemaP
  SwaggerDoc
  Object
  [Pair]
  TeamExportUser
  (Text
   -> Maybe RichInfo
   -> UserId
   -> Int
   -> Maybe UTCTime
   -> Maybe AccountStatus
   -> TeamExportUser)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser Text
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     TeamExportUser
     (Maybe RichInfo
      -> UserId
      -> Int
      -> Maybe UTCTime
      -> Maybe AccountStatus
      -> TeamExportUser)
forall a b.
SchemaP SwaggerDoc Object [Pair] TeamExportUser (a -> b)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser a
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TeamExportUser -> Text
tExportSCIMExternalId (TeamExportUser -> Text)
-> SchemaP SwaggerDoc Object [Pair] Text Text
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser Text
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= Text
-> SchemaP NamedSwaggerDoc Value Value Text Text
-> SchemaP SwaggerDoc Object [Pair] Text Text
forall doc' doc a b.
HasField doc' doc =>
Text
-> SchemaP doc' Value Value a b -> SchemaP doc Object [Pair] a b
field Text
"scim_external_id" SchemaP NamedSwaggerDoc Value Value Text Text
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema
        SchemaP
  SwaggerDoc
  Object
  [Pair]
  TeamExportUser
  (Maybe RichInfo
   -> UserId
   -> Int
   -> Maybe UTCTime
   -> Maybe AccountStatus
   -> TeamExportUser)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser (Maybe RichInfo)
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     TeamExportUser
     (UserId
      -> Int -> Maybe UTCTime -> Maybe AccountStatus -> TeamExportUser)
forall a b.
SchemaP SwaggerDoc Object [Pair] TeamExportUser (a -> b)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser a
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TeamExportUser -> Maybe RichInfo
tExportSCIMRichInfo (TeamExportUser -> Maybe RichInfo)
-> SchemaP
     SwaggerDoc Object [Pair] (Maybe RichInfo) (Maybe RichInfo)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser (Maybe RichInfo)
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= SchemaP SwaggerDoc Object [Pair] RichInfo (Maybe RichInfo)
-> SchemaP
     SwaggerDoc Object [Pair] (Maybe RichInfo) (Maybe RichInfo)
forall w d v a b.
Monoid w =>
SchemaP d v w a b -> SchemaP d v w (Maybe a) b
maybe_ (Text
-> SchemaP NamedSwaggerDoc Value Value RichInfo RichInfo
-> SchemaP SwaggerDoc Object [Pair] RichInfo (Maybe RichInfo)
forall doc doc' a b.
(HasOpt doc, HasField doc' doc) =>
Text
-> SchemaP doc' Value Value a b
-> SchemaP doc Object [Pair] a (Maybe b)
optField Text
"scim_rich_info" SchemaP NamedSwaggerDoc Value Value RichInfo RichInfo
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema)
        SchemaP
  SwaggerDoc
  Object
  [Pair]
  TeamExportUser
  (UserId
   -> Int -> Maybe UTCTime -> Maybe AccountStatus -> TeamExportUser)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser UserId
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     TeamExportUser
     (Int -> Maybe UTCTime -> Maybe AccountStatus -> TeamExportUser)
forall a b.
SchemaP SwaggerDoc Object [Pair] TeamExportUser (a -> b)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser a
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TeamExportUser -> UserId
tExportUserId (TeamExportUser -> UserId)
-> SchemaP SwaggerDoc Object [Pair] UserId UserId
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser UserId
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= Text
-> SchemaP NamedSwaggerDoc Value Value UserId UserId
-> SchemaP SwaggerDoc Object [Pair] UserId UserId
forall doc' doc a b.
HasField doc' doc =>
Text
-> SchemaP doc' Value Value a b -> SchemaP doc Object [Pair] a b
field Text
"user_id" SchemaP NamedSwaggerDoc Value Value UserId UserId
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema
        SchemaP
  SwaggerDoc
  Object
  [Pair]
  TeamExportUser
  (Int -> Maybe UTCTime -> Maybe AccountStatus -> TeamExportUser)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser Int
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     TeamExportUser
     (Maybe UTCTime -> Maybe AccountStatus -> TeamExportUser)
forall a b.
SchemaP SwaggerDoc Object [Pair] TeamExportUser (a -> b)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser a
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TeamExportUser -> Int
tExportNumDevices (TeamExportUser -> Int)
-> SchemaP SwaggerDoc Object [Pair] Int Int
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser Int
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= Text
-> SchemaP NamedSwaggerDoc Value Value Int Int
-> SchemaP SwaggerDoc Object [Pair] Int Int
forall doc' doc a b.
HasField doc' doc =>
Text
-> SchemaP doc' Value Value a b -> SchemaP doc Object [Pair] a b
field Text
"num_devices" SchemaP NamedSwaggerDoc Value Value Int Int
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema
        SchemaP
  SwaggerDoc
  Object
  [Pair]
  TeamExportUser
  (Maybe UTCTime -> Maybe AccountStatus -> TeamExportUser)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser (Maybe UTCTime)
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     TeamExportUser
     (Maybe AccountStatus -> TeamExportUser)
forall a b.
SchemaP SwaggerDoc Object [Pair] TeamExportUser (a -> b)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser a
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TeamExportUser -> Maybe UTCTime
tExportLastActive (TeamExportUser -> Maybe UTCTime)
-> SchemaP SwaggerDoc Object [Pair] (Maybe UTCTime) (Maybe UTCTime)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser (Maybe UTCTime)
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= SchemaP SwaggerDoc Object [Pair] UTCTime (Maybe UTCTime)
-> SchemaP SwaggerDoc Object [Pair] (Maybe UTCTime) (Maybe UTCTime)
forall w d v a b.
Monoid w =>
SchemaP d v w a b -> SchemaP d v w (Maybe a) b
maybe_ (Text
-> SchemaP NamedSwaggerDoc Value Value UTCTime UTCTime
-> SchemaP SwaggerDoc Object [Pair] UTCTime (Maybe UTCTime)
forall doc doc' a b.
(HasOpt doc, HasField doc' doc) =>
Text
-> SchemaP doc' Value Value a b
-> SchemaP doc Object [Pair] a (Maybe b)
optField Text
"last_active" SchemaP NamedSwaggerDoc Value Value UTCTime UTCTime
utcTimeSchema)
        SchemaP
  SwaggerDoc
  Object
  [Pair]
  TeamExportUser
  (Maybe AccountStatus -> TeamExportUser)
-> SchemaP
     SwaggerDoc Object [Pair] TeamExportUser (Maybe AccountStatus)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser TeamExportUser
forall a b.
SchemaP SwaggerDoc Object [Pair] TeamExportUser (a -> b)
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser a
-> SchemaP SwaggerDoc Object [Pair] TeamExportUser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TeamExportUser -> Maybe AccountStatus
tExportStatus (TeamExportUser -> Maybe AccountStatus)
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     (Maybe AccountStatus)
     (Maybe AccountStatus)
-> SchemaP
     SwaggerDoc Object [Pair] TeamExportUser (Maybe AccountStatus)
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= SchemaP
  SwaggerDoc Object [Pair] AccountStatus (Maybe AccountStatus)
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     (Maybe AccountStatus)
     (Maybe AccountStatus)
forall w d v a b.
Monoid w =>
SchemaP d v w a b -> SchemaP d v w (Maybe a) b
maybe_ (Text
-> SchemaP NamedSwaggerDoc Value Value AccountStatus AccountStatus
-> SchemaP
     SwaggerDoc Object [Pair] AccountStatus (Maybe AccountStatus)
forall doc doc' a b.
(HasOpt doc, HasField doc' doc) =>
Text
-> SchemaP doc' Value Value a b
-> SchemaP doc Object [Pair] a (Maybe b)
optField Text
"status" SchemaP NamedSwaggerDoc Value Value AccountStatus AccountStatus
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema)

instance ToNamedRecord TeamExportUser where
  toNamedRecord :: TeamExportUser -> NamedRecord
toNamedRecord TeamExportUser
row =
    [(ByteString, ByteString)] -> NamedRecord
namedRecord
      [ (ByteString
"display_name", Name -> ByteString
forall a. ToByteString a => a -> ByteString
secureCsvFieldToByteString (TeamExportUser -> Name
tExportDisplayName TeamExportUser
row)),
        (ByteString
"handle", ByteString -> (Handle -> ByteString) -> Maybe Handle -> ByteString
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ByteString
"" Handle -> ByteString
forall a. ToByteString a => a -> ByteString
secureCsvFieldToByteString (TeamExportUser -> Maybe Handle
tExportHandle TeamExportUser
row)),
        (ByteString
"email", ByteString
-> (EmailAddress -> ByteString) -> Maybe EmailAddress -> ByteString
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ByteString
"" EmailAddress -> ByteString
forall a. ToByteString a => a -> ByteString
secureCsvFieldToByteString (TeamExportUser -> Maybe EmailAddress
tExportEmail TeamExportUser
row)),
        (ByteString
"role", ByteString -> (Role -> ByteString) -> Maybe Role -> ByteString
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ByteString
"" Role -> ByteString
forall a. ToByteString a => a -> ByteString
secureCsvFieldToByteString (TeamExportUser -> Maybe Role
tExportRole TeamExportUser
row)),
        (ByteString
"created_on", ByteString
-> (UTCTimeMillis -> ByteString)
-> Maybe UTCTimeMillis
-> ByteString
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ByteString
"" UTCTimeMillis -> ByteString
forall a. ToByteString a => a -> ByteString
secureCsvFieldToByteString (TeamExportUser -> Maybe UTCTimeMillis
tExportCreatedOn TeamExportUser
row)),
        (ByteString
"invited_by", ByteString -> (Handle -> ByteString) -> Maybe Handle -> ByteString
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ByteString
"" Handle -> ByteString
forall a. ToByteString a => a -> ByteString
secureCsvFieldToByteString (TeamExportUser -> Maybe Handle
tExportInvitedBy TeamExportUser
row)),
        (ByteString
"idp_issuer", ByteString
-> (HttpsUrl -> ByteString) -> Maybe HttpsUrl -> ByteString
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ByteString
"" HttpsUrl -> ByteString
forall a. ToByteString a => a -> ByteString
secureCsvFieldToByteString (TeamExportUser -> Maybe HttpsUrl
tExportIdpIssuer TeamExportUser
row)),
        (ByteString
"managed_by", ManagedBy -> ByteString
forall a. ToByteString a => a -> ByteString
secureCsvFieldToByteString (TeamExportUser -> ManagedBy
tExportManagedBy TeamExportUser
row)),
        (ByteString
"saml_name_id", Text -> ByteString
forall a. ToByteString a => a -> ByteString
secureCsvFieldToByteString (TeamExportUser -> Text
tExportSAMLNamedId TeamExportUser
row)),
        (ByteString
"scim_external_id", Text -> ByteString
forall a. ToByteString a => a -> ByteString
secureCsvFieldToByteString (TeamExportUser -> Text
tExportSCIMExternalId TeamExportUser
row)),
        (ByteString
"scim_rich_info", ByteString
-> (RichInfo -> ByteString) -> Maybe RichInfo -> ByteString
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ByteString
"" (ByteString -> ByteString
C.toStrict (ByteString -> ByteString)
-> (RichInfo -> ByteString) -> RichInfo -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RichInfo -> ByteString
forall a. ToJSON a => a -> ByteString
Aeson.encode) (TeamExportUser -> Maybe RichInfo
tExportSCIMRichInfo TeamExportUser
row)),
        (ByteString
"user_id", UserId -> ByteString
forall a. ToByteString a => a -> ByteString
secureCsvFieldToByteString (TeamExportUser -> UserId
tExportUserId TeamExportUser
row)),
        (ByteString
"num_devices", Int -> ByteString
forall a. ToByteString a => a -> ByteString
secureCsvFieldToByteString (TeamExportUser -> Int
tExportNumDevices TeamExportUser
row)),
        ( ByteString
"last_active",
          String -> ByteString
C.pack
            ( String -> (UTCTime -> String) -> Maybe UTCTime -> String
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
                String
""
                (TimeLocale -> String -> UTCTime -> String
forall t. FormatTime t => TimeLocale -> String -> t -> String
formatTime TimeLocale
defaultTimeLocale String
timestampFormat)
                (TeamExportUser -> Maybe UTCTime
tExportLastActive TeamExportUser
row)
            )
        ),
        (ByteString
"status", ByteString
-> (AccountStatus -> ByteString)
-> Maybe AccountStatus
-> ByteString
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ByteString
"" AccountStatus -> ByteString
formatAccountStatus (TeamExportUser -> Maybe AccountStatus
tExportStatus TeamExportUser
row))
      ]

secureCsvFieldToByteString :: forall a. (ToByteString a) => a -> ByteString
secureCsvFieldToByteString :: forall a. ToByteString a => a -> ByteString
secureCsvFieldToByteString = ByteString -> ByteString
quoted (ByteString -> ByteString) -> (a -> ByteString) -> a -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString'

instance DefaultOrdered TeamExportUser where
  headerOrder :: TeamExportUser -> Header
headerOrder =
    Header -> TeamExportUser -> Header
forall a b. a -> b -> a
const (Header -> TeamExportUser -> Header)
-> Header -> TeamExportUser -> Header
forall a b. (a -> b) -> a -> b
$
      [ByteString] -> Header
forall a. [a] -> Vector a
fromList
        [ ByteString
"display_name",
          ByteString
"handle",
          ByteString
"email",
          ByteString
"role",
          ByteString
"created_on",
          ByteString
"invited_by",
          ByteString
"idp_issuer",
          ByteString
"managed_by",
          ByteString
"saml_name_id",
          ByteString
"scim_external_id",
          ByteString
"scim_rich_info",
          ByteString
"user_id",
          ByteString
"num_devices",
          ByteString
"last_active",
          ByteString
"status"
        ]

allowEmpty :: (ByteString -> Parser a) -> ByteString -> Parser (Maybe a)
allowEmpty :: forall a.
(ByteString -> Parser a) -> ByteString -> Parser (Maybe a)
allowEmpty ByteString -> Parser a
_ ByteString
"" = Maybe a -> Parser (Maybe a)
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe a
forall a. Maybe a
Nothing
allowEmpty ByteString -> Parser a
p ByteString
str = a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a) -> Parser a -> Parser (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ByteString -> Parser a
p ByteString
str

parseByteString :: forall a. (FromByteString a) => ByteString -> Parser a
parseByteString :: forall a. FromByteString a => ByteString -> Parser a
parseByteString ByteString
bstr =
  case Parser a -> ByteString -> Either String a
forall a. Parser a -> ByteString -> Either String a
parseOnly (forall a. FromByteString a => Parser a
parser @a) (ByteString -> ByteString
C.fromStrict (ByteString -> ByteString
unquoted ByteString
bstr)) of
    Left String
err -> String -> Parser a
forall a. String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
err
    Right a
thing -> a -> Parser a
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
thing

parseUTCTime :: ByteString -> Parser UTCTime
parseUTCTime :: ByteString -> Parser UTCTime
parseUTCTime ByteString
b = do
  Text
s <- (UnicodeException -> Parser Text)
-> (Text -> Parser Text)
-> Either UnicodeException Text
-> Parser Text
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (String -> Parser Text
forall a. String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser Text)
-> (UnicodeException -> String) -> UnicodeException -> Parser Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UnicodeException -> String
forall e. Exception e => e -> String
displayException) Text -> Parser Text
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either UnicodeException Text -> Parser Text)
-> Either UnicodeException Text -> Parser Text
forall a b. (a -> b) -> a -> b
$ ByteString -> Either UnicodeException Text
T.decodeUtf8' ByteString
b
  Bool -> TimeLocale -> String -> String -> Parser UTCTime
forall (m :: * -> *) t.
(MonadFail m, ParseTime t) =>
Bool -> TimeLocale -> String -> String -> m t
parseTimeM Bool
False TimeLocale
defaultTimeLocale String
timestampFormat (Text -> String
T.unpack Text
s)

parseAccountStatus :: ByteString -> Parser AccountStatus
parseAccountStatus :: ByteString -> Parser AccountStatus
parseAccountStatus ByteString
"active" = AccountStatus -> Parser AccountStatus
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure AccountStatus
Active
parseAccountStatus ByteString
"suspended" = AccountStatus -> Parser AccountStatus
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure AccountStatus
Suspended
parseAccountStatus ByteString
"deleted" = AccountStatus -> Parser AccountStatus
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure AccountStatus
Deleted
parseAccountStatus ByteString
"ephemeral" = AccountStatus -> Parser AccountStatus
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure AccountStatus
Ephemeral
parseAccountStatus ByteString
"pending-invitation" = AccountStatus -> Parser AccountStatus
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure AccountStatus
PendingInvitation
parseAccountStatus ByteString
_ = String -> Parser AccountStatus
forall a. String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"invalid account status"

formatAccountStatus :: AccountStatus -> ByteString
formatAccountStatus :: AccountStatus -> ByteString
formatAccountStatus AccountStatus
Active = ByteString
"active"
formatAccountStatus AccountStatus
Suspended = ByteString
"suspended"
formatAccountStatus AccountStatus
Deleted = ByteString
"deleted"
formatAccountStatus AccountStatus
Ephemeral = ByteString
"ephemeral"
formatAccountStatus AccountStatus
PendingInvitation = ByteString
"pending-invitation"

instance FromNamedRecord TeamExportUser where
  parseNamedRecord :: NamedRecord -> Parser TeamExportUser
parseNamedRecord NamedRecord
nrec =
    Name
-> Maybe Handle
-> Maybe EmailAddress
-> Maybe Role
-> Maybe UTCTimeMillis
-> Maybe Handle
-> Maybe HttpsUrl
-> ManagedBy
-> Text
-> Text
-> Maybe RichInfo
-> UserId
-> Int
-> Maybe UTCTime
-> Maybe AccountStatus
-> TeamExportUser
TeamExportUser
      (Name
 -> Maybe Handle
 -> Maybe EmailAddress
 -> Maybe Role
 -> Maybe UTCTimeMillis
 -> Maybe Handle
 -> Maybe HttpsUrl
 -> ManagedBy
 -> Text
 -> Text
 -> Maybe RichInfo
 -> UserId
 -> Int
 -> Maybe UTCTime
 -> Maybe AccountStatus
 -> TeamExportUser)
-> Parser Name
-> Parser
     (Maybe Handle
      -> Maybe EmailAddress
      -> Maybe Role
      -> Maybe UTCTimeMillis
      -> Maybe Handle
      -> Maybe HttpsUrl
      -> ManagedBy
      -> Text
      -> Text
      -> Maybe RichInfo
      -> UserId
      -> Int
      -> Maybe UTCTime
      -> Maybe AccountStatus
      -> TeamExportUser)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (NamedRecord
nrec NamedRecord -> ByteString -> Parser ByteString
forall a. FromField a => NamedRecord -> ByteString -> Parser a
.: ByteString
"display_name" Parser ByteString -> (ByteString -> Parser Name) -> Parser Name
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> Parser Name
forall a. FromByteString a => ByteString -> Parser a
parseByteString)
      Parser
  (Maybe Handle
   -> Maybe EmailAddress
   -> Maybe Role
   -> Maybe UTCTimeMillis
   -> Maybe Handle
   -> Maybe HttpsUrl
   -> ManagedBy
   -> Text
   -> Text
   -> Maybe RichInfo
   -> UserId
   -> Int
   -> Maybe UTCTime
   -> Maybe AccountStatus
   -> TeamExportUser)
-> Parser (Maybe Handle)
-> Parser
     (Maybe EmailAddress
      -> Maybe Role
      -> Maybe UTCTimeMillis
      -> Maybe Handle
      -> Maybe HttpsUrl
      -> ManagedBy
      -> Text
      -> Text
      -> Maybe RichInfo
      -> UserId
      -> Int
      -> Maybe UTCTime
      -> Maybe AccountStatus
      -> TeamExportUser)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (NamedRecord
nrec NamedRecord -> ByteString -> Parser ByteString
forall a. FromField a => NamedRecord -> ByteString -> Parser a
.: ByteString
"handle" Parser ByteString
-> (ByteString -> Parser (Maybe Handle)) -> Parser (Maybe Handle)
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> Parser Handle)
-> ByteString -> Parser (Maybe Handle)
forall a.
(ByteString -> Parser a) -> ByteString -> Parser (Maybe a)
allowEmpty ByteString -> Parser Handle
forall a. FromByteString a => ByteString -> Parser a
parseByteString)
      Parser
  (Maybe EmailAddress
   -> Maybe Role
   -> Maybe UTCTimeMillis
   -> Maybe Handle
   -> Maybe HttpsUrl
   -> ManagedBy
   -> Text
   -> Text
   -> Maybe RichInfo
   -> UserId
   -> Int
   -> Maybe UTCTime
   -> Maybe AccountStatus
   -> TeamExportUser)
-> Parser (Maybe EmailAddress)
-> Parser
     (Maybe Role
      -> Maybe UTCTimeMillis
      -> Maybe Handle
      -> Maybe HttpsUrl
      -> ManagedBy
      -> Text
      -> Text
      -> Maybe RichInfo
      -> UserId
      -> Int
      -> Maybe UTCTime
      -> Maybe AccountStatus
      -> TeamExportUser)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (NamedRecord
nrec NamedRecord -> ByteString -> Parser ByteString
forall a. FromField a => NamedRecord -> ByteString -> Parser a
.: ByteString
"email" Parser ByteString
-> (ByteString -> Parser (Maybe EmailAddress))
-> Parser (Maybe EmailAddress)
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> Parser EmailAddress)
-> ByteString -> Parser (Maybe EmailAddress)
forall a.
(ByteString -> Parser a) -> ByteString -> Parser (Maybe a)
allowEmpty ByteString -> Parser EmailAddress
forall a. FromByteString a => ByteString -> Parser a
parseByteString)
      Parser
  (Maybe Role
   -> Maybe UTCTimeMillis
   -> Maybe Handle
   -> Maybe HttpsUrl
   -> ManagedBy
   -> Text
   -> Text
   -> Maybe RichInfo
   -> UserId
   -> Int
   -> Maybe UTCTime
   -> Maybe AccountStatus
   -> TeamExportUser)
-> Parser (Maybe Role)
-> Parser
     (Maybe UTCTimeMillis
      -> Maybe Handle
      -> Maybe HttpsUrl
      -> ManagedBy
      -> Text
      -> Text
      -> Maybe RichInfo
      -> UserId
      -> Int
      -> Maybe UTCTime
      -> Maybe AccountStatus
      -> TeamExportUser)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (NamedRecord
nrec NamedRecord -> ByteString -> Parser ByteString
forall a. FromField a => NamedRecord -> ByteString -> Parser a
.: ByteString
"role" Parser ByteString
-> (ByteString -> Parser (Maybe Role)) -> Parser (Maybe Role)
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> Parser Role) -> ByteString -> Parser (Maybe Role)
forall a.
(ByteString -> Parser a) -> ByteString -> Parser (Maybe a)
allowEmpty ByteString -> Parser Role
forall a. FromByteString a => ByteString -> Parser a
parseByteString)
      Parser
  (Maybe UTCTimeMillis
   -> Maybe Handle
   -> Maybe HttpsUrl
   -> ManagedBy
   -> Text
   -> Text
   -> Maybe RichInfo
   -> UserId
   -> Int
   -> Maybe UTCTime
   -> Maybe AccountStatus
   -> TeamExportUser)
-> Parser (Maybe UTCTimeMillis)
-> Parser
     (Maybe Handle
      -> Maybe HttpsUrl
      -> ManagedBy
      -> Text
      -> Text
      -> Maybe RichInfo
      -> UserId
      -> Int
      -> Maybe UTCTime
      -> Maybe AccountStatus
      -> TeamExportUser)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (NamedRecord
nrec NamedRecord -> ByteString -> Parser ByteString
forall a. FromField a => NamedRecord -> ByteString -> Parser a
.: ByteString
"created_on" Parser ByteString
-> (ByteString -> Parser (Maybe UTCTimeMillis))
-> Parser (Maybe UTCTimeMillis)
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> Parser UTCTimeMillis)
-> ByteString -> Parser (Maybe UTCTimeMillis)
forall a.
(ByteString -> Parser a) -> ByteString -> Parser (Maybe a)
allowEmpty ByteString -> Parser UTCTimeMillis
forall a. FromByteString a => ByteString -> Parser a
parseByteString)
      Parser
  (Maybe Handle
   -> Maybe HttpsUrl
   -> ManagedBy
   -> Text
   -> Text
   -> Maybe RichInfo
   -> UserId
   -> Int
   -> Maybe UTCTime
   -> Maybe AccountStatus
   -> TeamExportUser)
-> Parser (Maybe Handle)
-> Parser
     (Maybe HttpsUrl
      -> ManagedBy
      -> Text
      -> Text
      -> Maybe RichInfo
      -> UserId
      -> Int
      -> Maybe UTCTime
      -> Maybe AccountStatus
      -> TeamExportUser)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (NamedRecord
nrec NamedRecord -> ByteString -> Parser ByteString
forall a. FromField a => NamedRecord -> ByteString -> Parser a
.: ByteString
"invited_by" Parser ByteString
-> (ByteString -> Parser (Maybe Handle)) -> Parser (Maybe Handle)
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> Parser Handle)
-> ByteString -> Parser (Maybe Handle)
forall a.
(ByteString -> Parser a) -> ByteString -> Parser (Maybe a)
allowEmpty ByteString -> Parser Handle
forall a. FromByteString a => ByteString -> Parser a
parseByteString)
      Parser
  (Maybe HttpsUrl
   -> ManagedBy
   -> Text
   -> Text
   -> Maybe RichInfo
   -> UserId
   -> Int
   -> Maybe UTCTime
   -> Maybe AccountStatus
   -> TeamExportUser)
-> Parser (Maybe HttpsUrl)
-> Parser
     (ManagedBy
      -> Text
      -> Text
      -> Maybe RichInfo
      -> UserId
      -> Int
      -> Maybe UTCTime
      -> Maybe AccountStatus
      -> TeamExportUser)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (NamedRecord
nrec NamedRecord -> ByteString -> Parser ByteString
forall a. FromField a => NamedRecord -> ByteString -> Parser a
.: ByteString
"idp_issuer" Parser ByteString
-> (ByteString -> Parser (Maybe HttpsUrl))
-> Parser (Maybe HttpsUrl)
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> Parser HttpsUrl)
-> ByteString -> Parser (Maybe HttpsUrl)
forall a.
(ByteString -> Parser a) -> ByteString -> Parser (Maybe a)
allowEmpty ByteString -> Parser HttpsUrl
forall a. FromByteString a => ByteString -> Parser a
parseByteString)
      Parser
  (ManagedBy
   -> Text
   -> Text
   -> Maybe RichInfo
   -> UserId
   -> Int
   -> Maybe UTCTime
   -> Maybe AccountStatus
   -> TeamExportUser)
-> Parser ManagedBy
-> Parser
     (Text
      -> Text
      -> Maybe RichInfo
      -> UserId
      -> Int
      -> Maybe UTCTime
      -> Maybe AccountStatus
      -> TeamExportUser)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (NamedRecord
nrec NamedRecord -> ByteString -> Parser ByteString
forall a. FromField a => NamedRecord -> ByteString -> Parser a
.: ByteString
"managed_by" Parser ByteString
-> (ByteString -> Parser ManagedBy) -> Parser ManagedBy
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> Parser ManagedBy
forall a. FromByteString a => ByteString -> Parser a
parseByteString)
      Parser
  (Text
   -> Text
   -> Maybe RichInfo
   -> UserId
   -> Int
   -> Maybe UTCTime
   -> Maybe AccountStatus
   -> TeamExportUser)
-> Parser Text
-> Parser
     (Text
      -> Maybe RichInfo
      -> UserId
      -> Int
      -> Maybe UTCTime
      -> Maybe AccountStatus
      -> TeamExportUser)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (NamedRecord
nrec NamedRecord -> ByteString -> Parser ByteString
forall a. FromField a => NamedRecord -> ByteString -> Parser a
.: ByteString
"saml_name_id" Parser ByteString -> (ByteString -> Parser Text) -> Parser Text
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> Parser Text
forall a. FromByteString a => ByteString -> Parser a
parseByteString)
      Parser
  (Text
   -> Maybe RichInfo
   -> UserId
   -> Int
   -> Maybe UTCTime
   -> Maybe AccountStatus
   -> TeamExportUser)
-> Parser Text
-> Parser
     (Maybe RichInfo
      -> UserId
      -> Int
      -> Maybe UTCTime
      -> Maybe AccountStatus
      -> TeamExportUser)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (NamedRecord
nrec NamedRecord -> ByteString -> Parser ByteString
forall a. FromField a => NamedRecord -> ByteString -> Parser a
.: ByteString
"scim_external_id" Parser ByteString -> (ByteString -> Parser Text) -> Parser Text
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> Parser Text
forall a. FromByteString a => ByteString -> Parser a
parseByteString)
      Parser
  (Maybe RichInfo
   -> UserId
   -> Int
   -> Maybe UTCTime
   -> Maybe AccountStatus
   -> TeamExportUser)
-> Parser (Maybe RichInfo)
-> Parser
     (UserId
      -> Int -> Maybe UTCTime -> Maybe AccountStatus -> TeamExportUser)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ( NamedRecord
nrec NamedRecord -> ByteString -> Parser ByteString
forall a. FromField a => NamedRecord -> ByteString -> Parser a
.: ByteString
"scim_rich_info"
              Parser ByteString
-> (ByteString -> Parser (Maybe RichInfo))
-> Parser (Maybe RichInfo)
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> Parser RichInfo)
-> ByteString -> Parser (Maybe RichInfo)
forall a.
(ByteString -> Parser a) -> ByteString -> Parser (Maybe a)
allowEmpty
                ( Parser RichInfo
-> (RichInfo -> Parser RichInfo)
-> Maybe RichInfo
-> Parser RichInfo
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (String -> Parser RichInfo
forall a. String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"failed to decode RichInfo") RichInfo -> Parser RichInfo
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
                    (Maybe RichInfo -> Parser RichInfo)
-> (ByteString -> Maybe RichInfo) -> ByteString -> Parser RichInfo
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Maybe RichInfo
forall a. FromJSON a => ByteString -> Maybe a
Aeson.decode
                    (ByteString -> Maybe RichInfo)
-> (ByteString -> ByteString) -> ByteString -> Maybe RichInfo
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
C.fromStrict
                )
          )
      Parser
  (UserId
   -> Int -> Maybe UTCTime -> Maybe AccountStatus -> TeamExportUser)
-> Parser UserId
-> Parser
     (Int -> Maybe UTCTime -> Maybe AccountStatus -> TeamExportUser)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (NamedRecord
nrec NamedRecord -> ByteString -> Parser ByteString
forall a. FromField a => NamedRecord -> ByteString -> Parser a
.: ByteString
"user_id" Parser ByteString -> (ByteString -> Parser UserId) -> Parser UserId
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> Parser UserId
forall a. FromByteString a => ByteString -> Parser a
parseByteString)
      Parser
  (Int -> Maybe UTCTime -> Maybe AccountStatus -> TeamExportUser)
-> Parser Int
-> Parser (Maybe UTCTime -> Maybe AccountStatus -> TeamExportUser)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (NamedRecord
nrec NamedRecord -> ByteString -> Parser ByteString
forall a. FromField a => NamedRecord -> ByteString -> Parser a
.: ByteString
"num_devices" Parser ByteString -> (ByteString -> Parser Int) -> Parser Int
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> Parser Int
forall a. FromByteString a => ByteString -> Parser a
parseByteString)
      Parser (Maybe UTCTime -> Maybe AccountStatus -> TeamExportUser)
-> Parser (Maybe UTCTime)
-> Parser (Maybe AccountStatus -> TeamExportUser)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (NamedRecord
nrec NamedRecord -> ByteString -> Parser ByteString
forall a. FromField a => NamedRecord -> ByteString -> Parser a
.: ByteString
"last_active" Parser ByteString
-> (ByteString -> Parser (Maybe UTCTime)) -> Parser (Maybe UTCTime)
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> Parser UTCTime)
-> ByteString -> Parser (Maybe UTCTime)
forall a.
(ByteString -> Parser a) -> ByteString -> Parser (Maybe a)
allowEmpty ByteString -> Parser UTCTime
parseUTCTime)
      Parser (Maybe AccountStatus -> TeamExportUser)
-> Parser (Maybe AccountStatus) -> Parser TeamExportUser
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (NamedRecord
nrec NamedRecord -> ByteString -> Parser ByteString
forall a. FromField a => NamedRecord -> ByteString -> Parser a
.: ByteString
"status" Parser ByteString
-> (ByteString -> Parser (Maybe AccountStatus))
-> Parser (Maybe AccountStatus)
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> Parser AccountStatus)
-> ByteString -> Parser (Maybe AccountStatus)
forall a.
(ByteString -> Parser a) -> ByteString -> Parser (Maybe a)
allowEmpty ByteString -> Parser AccountStatus
parseAccountStatus)

quoted :: ByteString -> ByteString
quoted :: ByteString -> ByteString
quoted ByteString
bs = case ByteString -> Maybe (Char, ByteString)
C.uncons ByteString
bs of
  -- fields that begin with a disallowed character are prepended with a single quote
  Just (Char
'=', ByteString
_) -> Char
'\'' Char -> ByteString -> ByteString
`C.cons` ByteString
bs
  Just (Char
'+', ByteString
_) -> Char
'\'' Char -> ByteString -> ByteString
`C.cons` ByteString
bs
  Just (Char
'-', ByteString
_) -> Char
'\'' Char -> ByteString -> ByteString
`C.cons` ByteString
bs
  Just (Char
'@', ByteString
_) -> Char
'\'' Char -> ByteString -> ByteString
`C.cons` ByteString
bs
  -- tab
  Just (Char
'\x0009', ByteString
_) -> Char
'\'' Char -> ByteString -> ByteString
`C.cons` ByteString
bs
  -- carriage return
  Just (Char
'\x000D', ByteString
_) -> Char
'\'' Char -> ByteString -> ByteString
`C.cons` ByteString
bs
  -- if a field begins with a single quote we have to prepend another single quote to be able to decode back correctly
  Just (Char
'\'', ByteString
_) -> Char
'\'' Char -> ByteString -> ByteString
`C.cons` ByteString
bs
  -- everything else is fine
  Maybe (Char, ByteString)
_ -> ByteString
bs

unquoted :: ByteString -> ByteString
unquoted :: ByteString -> ByteString
unquoted ByteString
bstr = case ByteString -> Maybe (Char, ByteString)
C.uncons ByteString
bstr of
  Just (Char
'\'', ByteString
t) -> ByteString
t
  Maybe (Char, ByteString)
_ -> ByteString
bstr