module Git
  ( config,
    root,
  )
where

import Data.List.NonEmpty (NonEmpty ((:|)), nonEmpty)
import Data.Text (Text, pack, unpack)
import System.Process (readProcess)

config :: Text -> IO Text
config :: Text -> IO Text
config Text
key = do
  Maybe (NonEmpty String)
output <- [String] -> Maybe (NonEmpty String)
forall a. [a] -> Maybe (NonEmpty a)
nonEmpty ([String] -> Maybe (NonEmpty String))
-> (String -> [String]) -> String -> Maybe (NonEmpty String)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
lines (String -> Maybe (NonEmpty String))
-> IO String -> IO (Maybe (NonEmpty String))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> [String] -> String -> IO String
readProcess String
"git" [String
"config", Text -> String
unpack Text
key] []
  case Maybe (NonEmpty String)
output of
    Just (String
x :| [String]
_) -> Text -> IO Text
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Text -> IO Text) -> Text -> IO Text
forall a b. (a -> b) -> a -> b
$ String -> Text
pack String
x
    Maybe (NonEmpty String)
Nothing -> String -> IO Text
forall a. String -> IO a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> IO Text) -> String -> IO Text
forall a b. (a -> b) -> a -> b
$ String
"`git config " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Text -> String
unpack Text
key String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"` returned no output"

root :: IO Text
root :: IO Text
root = do
  Maybe (NonEmpty String)
output <- [String] -> Maybe (NonEmpty String)
forall a. [a] -> Maybe (NonEmpty a)
nonEmpty ([String] -> Maybe (NonEmpty String))
-> (String -> [String]) -> String -> Maybe (NonEmpty String)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
lines (String -> Maybe (NonEmpty String))
-> IO String -> IO (Maybe (NonEmpty String))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> [String] -> String -> IO String
readProcess String
"git" [String
"rev-parse", String
"--show-toplevel"] String
""
  case Maybe (NonEmpty String)
output of
    Just (String
x :| [String]
_) -> Text -> IO Text
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Text -> IO Text) -> Text -> IO Text
forall a b. (a -> b) -> a -> b
$ String -> Text
pack String
x
    Maybe (NonEmpty String)
Nothing -> String -> IO Text
forall a. String -> IO a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"`git rev-parse --show-toplevel` returned no output"