packages feed

arion-compose-0.1.2.0: src/haskell/lib/Arion/ExtendedInfo.hs

{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
{-

Parses the x-arion field in the generated compose file.

-}
module Arion.ExtendedInfo where

import Prelude()
import Protolude
import Data.Aeson as Aeson
import Arion.Aeson
import Control.Lens
import Data.Aeson.Lens

data Image = Image
  { image :: Maybe Text -- ^ image tar.gz file path
  , imageExe :: Maybe Text -- ^ path to exe producing image tar
  , imageName :: Text
  , imageTag :: Text
  } deriving (Eq, Show, Generic, Aeson.ToJSON, Aeson.FromJSON)

data ExtendedInfo = ExtendedInfo {
    projectName :: Maybe Text,
    images :: [Image]
  } deriving (Eq, Show)

loadExtendedInfoFromPath :: FilePath -> IO ExtendedInfo
loadExtendedInfoFromPath fp = do
  v <- decodeFile fp
  pure ExtendedInfo {
    -- TODO: use aeson derived instance?
    projectName = v ^? key "x-arion" . key "project" . key "name" . _String,
    images = (v :: Aeson.Value) ^.. key "x-arion" . key "images" . _Array . traverse . _JSON
  }