packages feed

dhall-to-cabal-1.2.0.0: cabal-to-dhall/Main.hs

{-# language NamedFieldPuns #-}
{-# language OverloadedStrings #-}

module Main ( main ) where

import Control.Applicative ( (<**>), optional )
import Data.Foldable ( asum )
import Data.Version ( showVersion )

import qualified Data.ByteString as ByteString
import qualified Data.Text.Prettyprint.Doc as Pretty
import qualified Data.Text.Prettyprint.Doc.Render.Text as Pretty
import qualified Options.Applicative as OptParse
import qualified System.IO

import CabalToDhall ( cabalToDhall, parseGenericPackageDescriptionThrows )
import DhallLocation ( dhallFromGitHub )
import Paths_dhall_to_cabal ( version )


data Command
  = RunCabalToDhall CabalToDhallOptions
  | PrintVersion


data CabalToDhallOptions = CabalToDhallOptions
  { cabalFilePath :: Maybe String
  }


cabalToDhallOptionsParser :: OptParse.Parser CabalToDhallOptions
cabalToDhallOptionsParser =
  CabalToDhallOptions
    <$>
      optional
        ( OptParse.argument
            OptParse.str
            ( mconcat
                [ OptParse.metavar "<cabal input file>"
                , OptParse.help "The Cabal file to convert to Dhall"
                ]
            )
        )


printVersionParser :: OptParse.Parser ()
printVersionParser =
  OptParse.flag'
    ()
    ( mconcat
      [ OptParse.long "version"
      , OptParse.help "Display dhall-to-cabal's version and exit."
      ]
    )


optionsParser = OptParse.info ( parser <**> OptParse.helper ) mempty
  where
    parser =
      asum
        [ RunCabalToDhall <$> cabalToDhallOptionsParser
        , PrintVersion <$ printVersionParser
        ]


main :: IO ()
main = do
  command <-
    OptParse.execParser optionsParser

  case command of
    RunCabalToDhall options ->
      runCabalToDhall options
    PrintVersion ->
      printVersion


runCabalToDhall :: CabalToDhallOptions -> IO ()
runCabalToDhall CabalToDhallOptions{ cabalFilePath } = do
  source <-
    case cabalFilePath of
      Nothing ->
        ByteString.getContents

      Just filePath ->
        ByteString.readFile filePath

  dhall <- cabalToDhall dhallFromGitHub <$>
    parseGenericPackageDescriptionThrows source

  Pretty.renderIO
    System.IO.stdout
    ( Pretty.layoutSmart opts
        ( Pretty.pretty dhall )
    )

  putStrLn ""



-- Shamelessly taken from dhall-format

-- Note: must remain in sync with the layout options in
-- golden-tests/GoldenTests.hs, so that test output is easy to generate
-- at the command line.
opts :: Pretty.LayoutOptions
opts =
  Pretty.defaultLayoutOptions
    { Pretty.layoutPageWidth = Pretty.AvailablePerLine 80 1.0 }


printVersion :: IO ()
printVersion = do
  putStrLn ( "cabal-to-dhall version " ++ showVersion version )