content: {-# LANGUAGE LambdaCase        #-}
  {-# LANGUAGE OverloadedStrings #-}
  module Main where
  
  import System.Environment (getArgs)
  import System.Directory
  import System.FilePath
  import Control.Monad
  
  import Nix.Pretty (prettyNix)
  import Nix.Expr
  
  import Data.Aeson
  import Lens.Micro
  import Lens.Micro.Aeson
  
  import Data.String (fromString)
  
  import Cabal2Nix.Util
  
  main :: IO ()
  main = getArgs >>= \case
    [path] -> do
      print . prettyNix =<< hashes path
    _ -> putStrLn "call with /path/to/all-cabal-hashes (Hashes2Nix /path/to/all-cabal-hashes)"
  
  hash :: FilePath -> String -> String -> IO (Binding NExpr)
  hash p pkg version = do
    let json = p </> pkg </> version </> pkg <.> "json"
        version' = fromString . quoted $ version
    doesFileExist json >>= \case
      True -> decodeValue json >>= \case
        Just obj -> case obj ^? key "package-hashes" . key "SHA256" . _String of
          Just hash -> pure $ version' $= mkStr hash
          Nothing   -> pure $ version' $= mkNull
        Nothing     -> pure $ version' $= mkNull
      False         -> pure $ version' $= mkNull
    where decodeValue :: FilePath -> IO (Maybe Value)
          decodeValue = decodeFileStrict'
  
  hashes :: FilePath -> IO NExpr
  hashes p =
    do pkgs <- listDirectories p
       fmap mkNonRecSet . forM pkgs $ \pkg ->
         do versions <- listDirectories (p </> pkg)
            let pkg' = fromString . quoted $ pkg
            fmap (bindTo pkg' . mkNonRecSet) . forM versions $ \version ->
              hash p pkg version
  
  