{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE NoImplicitPrelude #-}

module Neuron.Version where

import qualified Data.Text as T
import Data.Version (parseVersion, showVersion)
import qualified Neuron.Version.RepoVersion as RepoVersion
import Paths_neuron (version)
import Relude
import Text.ParserCombinators.ReadP (readP_to_S)

-- | Neuron cabal library version
neuronVersion :: Text
neuronVersion :: Text
neuronVersion = String -> Text
forall a. ToText a => a -> Text
toText (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ Version -> String
showVersion Version
version

-- | Neuron full version (cabal library version + git revision)
neuronVersionFull :: Text
neuronVersionFull :: Text
neuronVersionFull =
  [Text] -> Text
T.concat [Text
neuronVersion, " (", Text
RepoVersion.version, ")"]

-- | Check if `neuronVersion` is older than the given version
olderThan :: Text -> Bool
olderThan :: Text -> Bool
olderThan s :: Text
s =
  case [(Version, String)] -> [(Version, String)]
forall a. [a] -> [a]
reverse (ReadP Version -> ReadS Version
forall a. ReadP a -> ReadS a
readP_to_S ReadP Version
parseVersion (Text -> String
forall a. ToString a => a -> String
toString Text
s)) of
    (v2 :: Version
v2, _) : _ -> Version
version Version -> Version -> Bool
forall a. Ord a => a -> a -> Bool
< Version
v2
    x :: [(Version, String)]
x -> Text -> Bool
forall a t. (HasCallStack, IsText t) => t -> a
error (Text -> Bool) -> Text -> Bool
forall a b. (a -> b) -> a -> b
$ "Version parse error: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> [(Version, String)] -> Text
forall b a. (Show a, IsString b) => a -> b
show [(Version, String)]
x