module Cachix.Client.NixVersion
  ( getNixVersion
  , parseNixVersion
  , NixVersion(..)
  ) where

import Protolude
import System.Process (readProcessWithExitCode)
import Data.Versions
import Data.Text as T


data NixVersion
  = Nix20
  | Nix201
  | Nix1XX
  deriving (Show, Eq)

getNixVersion :: IO (Either Text NixVersion)
getNixVersion = do
  (exitcode, out, err) <- readProcessWithExitCode "nix-env" ["--version"] mempty
  unless (err == "") $ putStrLn $ "nix-env stderr: " <> err
  return $ case exitcode of
    ExitFailure i -> Left $ "'nix-env --version' exited with " <> show i
    ExitSuccess -> parseNixVersion $ toS out

parseNixVersion :: Text -> Either Text NixVersion
parseNixVersion output =
  let
    verStr = T.drop 14 $ T.strip output
    err = "Couldn't parse 'nix-env --version' output: " <> output
  in case versioning verStr of
    Left _ -> Left err
    Right ver | verStr == "" -> Left err
              | ver < Ideal (SemVer 1 99 0 [] []) -> Right Nix1XX
              | ver < Ideal (SemVer 2 0 1 [] []) -> Right Nix20
              | otherwise -> Right Nix201