-- | @project.rename@ input handler
module Unison.Codebase.Editor.HandleInput.ProjectRename
  ( handleProjectRename,
  )
where

import U.Codebase.Sqlite.Project (Project (..))
import U.Codebase.Sqlite.Queries qualified as Queries
import Unison.Cli.Monad (Cli)
import Unison.Cli.Monad qualified as Cli
import Unison.Cli.MonadUtils qualified as Cli
import Unison.Codebase.Editor.Output qualified as Output
import Unison.Prelude
import Unison.Project (ProjectAndBranch (..), ProjectName)

handleProjectRename :: ProjectName -> Cli ()
handleProjectRename :: ProjectName -> Cli ()
handleProjectRename ProjectName
newName = do
  ProjectAndBranch project _branch <- Cli (ProjectAndBranch Project ProjectBranch)
Cli.getCurrentProjectAndBranch
  let oldName = Project
project.name
  when (oldName /= newName) do
    Cli.runTransactionWithRollback \forall void. Output -> Transaction void
rollback -> do
      ProjectName -> Transaction (Maybe Project)
Queries.loadProjectByName ProjectName
newName Transaction (Maybe Project)
-> (Maybe Project -> Transaction ()) -> Transaction ()
forall a b. Transaction a -> (a -> Transaction b) -> Transaction b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Just Project
_ -> Output -> Transaction ()
forall void. Output -> Transaction void
rollback (ProjectName -> Output
Output.ProjectNameAlreadyExists ProjectName
newName)
        Maybe Project
Nothing -> ProjectId -> ProjectName -> Transaction ()
Queries.renameProject Project
project.projectId ProjectName
newName
  Cli.respond (Output.RenamedProject oldName newName)