module Unison.Share.Codeserver where

import Network.URI (parseURI)
import System.IO.Unsafe (unsafePerformIO)
import Unison.Codebase.Editor.RemoteRepo qualified as RemoteRepo
import Unison.Prelude
import Unison.Share.Types
import Unison.Share.Types qualified as Share
import UnliftIO.Environment (lookupEnv)

-- | This is the URI where the share API is based.
defaultCodeserver :: CodeserverURI
defaultCodeserver :: CodeserverURI
defaultCodeserver = IO CodeserverURI -> CodeserverURI
forall a. IO a -> a
unsafePerformIO (IO CodeserverURI -> CodeserverURI)
-> IO CodeserverURI -> CodeserverURI
forall a b. (a -> b) -> a -> b
$ do
  [Char] -> IO (Maybe [Char])
forall (m :: * -> *). MonadIO m => [Char] -> m (Maybe [Char])
lookupEnv [Char]
"UNISON_SHARE_HOST" IO (Maybe [Char])
-> (Maybe [Char] -> CodeserverURI) -> IO CodeserverURI
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> \case
    Maybe [Char]
Nothing ->
      CodeserverURI
        { $sel:codeserverScheme:CodeserverURI :: Scheme
codeserverScheme = Scheme
Share.Https,
          $sel:codeserverUserInfo:CodeserverURI :: [Char]
codeserverUserInfo = [Char]
"",
          $sel:codeserverRegName:CodeserverURI :: [Char]
codeserverRegName = [Char]
"api.unison-lang.org",
          $sel:codeserverPort:CodeserverURI :: Maybe Int
codeserverPort = Maybe Int
forall a. Maybe a
Nothing,
          $sel:codeserverPath:CodeserverURI :: [[Char]]
codeserverPath = []
        }
    Just [Char]
shareHost ->
      CodeserverURI -> Maybe CodeserverURI -> CodeserverURI
forall a. a -> Maybe a -> a
fromMaybe ([Char] -> CodeserverURI
forall a. HasCallStack => [Char] -> a
error ([Char] -> CodeserverURI) -> [Char] -> CodeserverURI
forall a b. (a -> b) -> a -> b
$ [Char]
"Share Host is not a valid URI: " [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char]
shareHost) (Maybe CodeserverURI -> CodeserverURI)
-> Maybe CodeserverURI -> CodeserverURI
forall a b. (a -> b) -> a -> b
$ do
        URI
uri <- [Char] -> Maybe URI
parseURI [Char]
shareHost
        URI -> Maybe CodeserverURI
codeserverFromURI URI
uri
{-# NOINLINE defaultCodeserver #-}

resolveCodeserver :: RemoteRepo.ShareCodeserver -> CodeserverURI
resolveCodeserver :: ShareCodeserver -> CodeserverURI
resolveCodeserver = \case
  ShareCodeserver
RemoteRepo.DefaultCodeserver -> CodeserverURI
defaultCodeserver
  RemoteRepo.CustomCodeserver CodeserverURI
cs -> CodeserverURI
cs