module API.Federator where

import Data.Function
import GHC.Stack
import qualified Network.HTTP.Client as HTTP
import Testlib.Prelude

getMetrics ::
  (HasCallStack, MakesValue domain) =>
  domain ->
  (ServiceMap -> HostPort) ->
  App Response
getMetrics :: forall domain.
(HasCallStack, MakesValue domain) =>
domain -> (ServiceMap -> HostPort) -> App Response
getMetrics domain
domain ServiceMap -> HostPort
service = do
  Request
req <- domain -> (ServiceMap -> HostPort) -> String -> App Request
forall domain.
(HasCallStack, MakesValue domain) =>
domain -> (ServiceMap -> HostPort) -> String -> App Request
rawBaseRequestF domain
domain ServiceMap -> HostPort
service String
"i/metrics"
  String -> Request -> App Response
submit String
"GET" Request
req

rawBaseRequestF :: (HasCallStack, MakesValue domain) => domain -> (ServiceMap -> HostPort) -> String -> App HTTP.Request
rawBaseRequestF :: forall domain.
(HasCallStack, MakesValue domain) =>
domain -> (ServiceMap -> HostPort) -> String -> App Request
rawBaseRequestF domain
domain ServiceMap -> HostPort
getService String
path = do
  String
domainV <- domain -> App String
forall a. (HasCallStack, MakesValue a) => a -> App String
objDomain domain
domain
  ServiceMap
serviceMap <- HasCallStack => String -> App ServiceMap
String -> App ServiceMap
getServiceMap String
domainV

  IO Request -> App Request
forall a. IO a -> App a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Request -> App Request)
-> (String -> IO Request) -> String -> App Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> IO Request
forall (m :: * -> *). MonadThrow m => String -> m Request
HTTP.parseRequest (String -> App Request) -> String -> App Request
forall a b. (a -> b) -> a -> b
$
    let HostPort String
h Word16
p = ServiceMap -> HostPort
getService ServiceMap
serviceMap
     in String
"http://" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
h String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
":" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Word16 -> String
forall a. Show a => a -> String
show Word16
p String -> String -> String
forall a. Semigroup a => a -> a -> a
<> (String
"/" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> [String] -> String
joinHttpPath (String -> [String]
splitHttpPath String
path))