packages feed

ribosome-app-0.9.9.9: lib/Ribosome/App/NewOptions.hs

module Ribosome.App.NewOptions where

import Path (Dir, Path, Rel, parseRelDir)
import Rainbow (chunk, fore, magenta)

import qualified Ribosome.App.Data as Data
import Ribosome.App.Data (FlakeUrl, NewProject (NewProject))
import Ribosome.App.Error (RainbowError, appError)
import Ribosome.App.Options (NewOptions)
import Ribosome.App.ProjectOptions (projectOptions)
import Ribosome.App.UserInput (askRequired)

defaultFlakeUrl :: FlakeUrl
defaultFlakeUrl =
  "git+https://git.tryp.io/tek/ribosome"

parseDir ::
  ToText a =>
  ToString a =>
  Member (Stop RainbowError) r =>
  a ->
  Sem r (Path Rel Dir)
parseDir name =
  stopNote invalidName (parseRelDir (toString name))
  where
    invalidName =
      appError [fore magenta (chunk (toText name)), " cannot be used as a directory name."]

newOptions ::
  Members [Stop RainbowError, Embed IO] r =>
  NewOptions ->
  Sem r NewProject
newOptions opts = do
  project <- projectOptions True (opts ^. #project)
  author <- maybe (askRequired "Author name for Cabal file?") pure (opts ^. #author)
  maintainer <- maybe (askRequired "Maintainer email for Cabal file?") pure (opts ^. #maintainer)
  let
    flakeUrl =
      fromMaybe defaultFlakeUrl (opts ^. #flakeUrl)
    printDir =
      opts ^. #printDir
  pure NewProject {..}