packages feed

cabal-rpm-2.2.0: src/Stackage/Snapshots.hs

{-# LANGUAGE CPP, OverloadedStrings #-}

module Stackage.Snapshots (
  latestMajorSnapshot,
  latestLTS,
  latestLtsSnapshot,
  resolveMajor
  )
where

import Data.Aeson
import qualified Data.Text as T
import Network.HTTP.Query
import SimpleCmd (error')
import System.Cached.JSON

import Stackage.MajorVer

latestMajorSnapshot :: MajorVer -> IO (Maybe String)
latestMajorSnapshot ver = do
  lookupKey (T.pack (showMajor ver)) <$> getSnapshots

getSnapshots :: IO Object
getSnapshots =
  getCachedJSON "stackage-snapshots" "snapshots.json" "https://www.stackage.org/download/snapshots.json" 200

latestLTS :: IO MajorVer
latestLTS = do
  msnap <- lookupKey "lts" <$> getSnapshots
  case msnap of
    Just snap -> return $ snapMajorVer snap
    Nothing -> error' "could not resolve lts major version"

latestLtsSnapshot :: IO String
latestLtsSnapshot = do
  msnap <- resolveMajor LatestLTS >>= latestMajorSnapshot
  case msnap of
    Nothing ->
      error' "failed to determine latest lts snapshot"
    Just snap -> return snap

-- converts 'lts' to actual version
resolveMajor :: MajorVerAlias -> IO MajorVer
resolveMajor LatestLTS = latestLTS
resolveMajor (MajorVer ver) = return ver