mirror of
https://github.com/commercialhaskell/stackage.git
synced 2026-01-13 15:58:32 +01:00
45 lines
1.2 KiB
Haskell
45 lines
1.2 KiB
Haskell
{-# LANGUAGE DeriveGeneric #-}
|
|
{-# LANGUAGE DeriveAnyClass #-}
|
|
{-# LANGUAGE NamedFieldPuns #-}
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
{-# OPTIONS -Wno-name-shadowing #-}
|
|
module Snapshot (loadSnapshot, snapshotMap) where
|
|
|
|
import Control.Arrow
|
|
import Data.Aeson
|
|
import GHC.Generics
|
|
import RIO.Map (Map)
|
|
import qualified Data.Text as T
|
|
import qualified Data.Yaml as Y
|
|
import qualified RIO.Map as M
|
|
|
|
import Types
|
|
|
|
data Snapshot = Snapshot
|
|
{ packages :: [SnapshotPackage]
|
|
} deriving (FromJSON, Generic, Show)
|
|
|
|
data SnapshotPackage = SnapshotPackage
|
|
{ hackage :: PackageVersion
|
|
} deriving (FromJSON, Generic, Show)
|
|
|
|
data PackageVersion = PackageVersion
|
|
{ pvPackage :: PackageName
|
|
, pvVersion :: Version
|
|
} deriving Show
|
|
|
|
instance FromJSON PackageVersion where
|
|
parseJSON s0 = do
|
|
s1 <- parseJSON s0
|
|
let s2 = T.takeWhile (/= '@') s1
|
|
let xs = T.splitOn "-" s2
|
|
pvPackage <- parseJSON $ String $ T.intercalate "-" (init xs)
|
|
pvVersion <- parseJSON $ String $ last xs
|
|
pure PackageVersion { pvPackage, pvVersion }
|
|
|
|
snapshotMap :: Snapshot -> Map PackageName Version
|
|
snapshotMap = M.fromList . map ((pvPackage &&& pvVersion) . hackage) . packages
|
|
|
|
loadSnapshot :: FilePath -> IO Snapshot
|
|
loadSnapshot = fmap (either (error . show) id) . Y.decodeFileEither
|