module LaunchDarkly.Server.Client.Internal
( Client(..)
, ClientI(..)
, Status(..)
, clientVersion
, setStatus
, getStatusI
) where
import Data.Text (Text)
import Data.IORef (IORef, readIORef, atomicModifyIORef')
import GHC.Generics (Generic)
import Control.Concurrent (ThreadId)
import Control.Concurrent.MVar (MVar)
import Data.Generics.Product (getField)
import LaunchDarkly.Server.Client.Status (Status(..), transitionStatus)
import LaunchDarkly.Server.Config.Internal (ConfigI)
import LaunchDarkly.Server.Store.Internal (StoreHandle, getInitializedC)
import LaunchDarkly.Server.Events (EventState)
import LaunchDarkly.Server.DataSource.Internal (DataSource)
newtype Client = Client ClientI
clientVersion :: Text
clientVersion :: Text
clientVersion = Text
"3.0.1"
setStatus :: ClientI -> Status -> IO ()
setStatus :: ClientI -> Status -> IO ()
setStatus ClientI
client Status
status' =
IORef Status -> (Status -> (Status, ())) -> IO ()
forall a b. IORef a -> (a -> (a, b)) -> IO b
atomicModifyIORef' (ClientI -> IORef Status
forall (f :: Symbol) a s. HasField' f s a => s -> a
getField @"status" ClientI
client) ((Status -> (Status, ()))
-> (Status -> Status) -> Status -> (Status, ())
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (,()) (Status -> Status -> Status
transitionStatus Status
status'))
getStatusI :: ClientI -> IO Status
getStatusI :: ClientI -> IO Status
getStatusI ClientI
client = IORef Status -> IO Status
forall a. IORef a -> IO a
readIORef (ClientI -> IORef Status
forall (f :: Symbol) a s. HasField' f s a => s -> a
getField @"status" ClientI
client) IO Status -> (Status -> IO Status) -> IO Status
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Status
Unauthorized -> Status -> IO Status
forall (f :: * -> *) a. Applicative f => a -> f a
pure Status
Unauthorized
Status
ShuttingDown -> Status -> IO Status
forall (f :: * -> *) a. Applicative f => a -> f a
pure Status
ShuttingDown
Status
_ -> StoreHandle IO -> StoreResultM IO Bool
forall store (m :: * -> *).
LaunchDarklyStoreRead store m =>
store -> StoreResultM m Bool
getInitializedC (ClientI -> StoreHandle IO
forall (f :: Symbol) a s. HasField' f s a => s -> a
getField @"store" ClientI
client) StoreResultM IO Bool
-> (Either Text Bool -> IO Status) -> IO Status
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Right Bool
True -> Status -> IO Status
forall (f :: * -> *) a. Applicative f => a -> f a
pure Status
Initialized
Either Text Bool
_ -> Status -> IO Status
forall (f :: * -> *) a. Applicative f => a -> f a
pure Status
Uninitialized
data ClientI = ClientI
{ ClientI -> ConfigI
config :: !(ConfigI)
, ClientI -> StoreHandle IO
store :: !(StoreHandle IO)
, ClientI -> IORef Status
status :: !(IORef Status)
, ClientI -> EventState
events :: !EventState
, ClientI -> Maybe (ThreadId, MVar ())
eventThreadPair :: !(Maybe (ThreadId, MVar ()))
, ClientI -> DataSource
dataSource :: !DataSource
} deriving ((forall x. ClientI -> Rep ClientI x)
-> (forall x. Rep ClientI x -> ClientI) -> Generic ClientI
forall x. Rep ClientI x -> ClientI
forall x. ClientI -> Rep ClientI x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep ClientI x -> ClientI
$cfrom :: forall x. ClientI -> Rep ClientI x
Generic)