module BiDi.BiDiUrl where import Data.Function ((&)) import Data.Text (Text, breakOn, pack, splitOn, unpack) import Text.Read (readEither) import WebDriverPreCore.HTTP.Protocol (SessionResponse(..)) import Utils (txt) getBiDiUrl :: SessionResponse -> Either Text BiDiUrl getBiDiUrl r = r.webSocketUrl & maybe (Left $ "WebSocket URL not provided in session response:\n" <> txt r) parseUrl parseUrl :: Text -> Either Text BiDiUrl parseUrl url = do (_scheme, hostPortPath) <- splitScheme (host, portPath) <- splitHost hostPortPath (port, path) <- portAndPath portPath Right $ MkBiDiUrl { host, port, path } where -- "ws://127.0.0.1:9222/session/e43698d9-b02a-4284-a936-12041deb3552" -- -> [ws, //127.0.0.1, 9222/session/e43698d9-b02a-4284-a936-12041deb3552] splitScheme = splitOn "://" url & \case [scheme, hostPortPath] -> Right (scheme, hostPortPath) _ -> failParser "Expected format: ws://host:port/path" splitHost hostPortPath = splitOn ":" hostPortPath & \case [host, portPath] -> Right (host, portPath) _ -> failParser "Expected format: host:port/path" -- 9222/session/e43698d9-b02a-4284-a936-12041deb3552 -- -> (9222, session/e43698d9-b02a-4284-a936-12041deb3552) portAndPath :: Text -> Either Text (Int, Text) portAndPath pp = (,path) <$> portEth where (portTxt, path) = breakOn "/" pp portEth = case readEither $ unpack portTxt of Left msg -> failParser $ "Could not extract port (an Int) from pBiDi.BiDiRunnerrefix of: " <> portTxt <> "\n" <> "Error on read Int: " <> pack msg Right p -> Right p failParser :: forall a. Text -> Either Text a failParser msg = Left $ "Failed to parse URL: " <> url <> "\n" <> msg -- | WebDriver BiDi client configuration data BiDiUrl = MkBiDiUrl { host :: Text, port :: Int, path :: Text } deriving (Show)