packages feed

stacker-0.0.1.0: src/Types.hs

{-# LANGUAGE OverloadedStrings #-}

module Types where

import Data.Map.Strict (Map)
import Data.Text (Text)
import Data.Version (showVersion)
import GHC.Generics (Generic)
import Paths_stacker qualified as Paths

-- | LTS version (e.g., "24.23" for lts-24.23)
data LTSVersion = LTSVersion
  { ltsMajor :: Int
  , ltsMinor :: Int
  } deriving (Eq, Ord, Show, Generic)

-- | Nightly version (e.g., "2025-12-09" for nightly-2025-12-09)
data NightlyVersion = NightlyVersion
  { nightlyYear :: Int
  , nightlyMonth :: Int
  , nightlyDay :: Int
  } deriving (Eq, Ord, Show, Generic)

-- | GHC version (e.g., "9.10.1")
data GHCVersion = GHCVersion
  { ghcMajor1 :: Int
  , ghcMajor2 :: Int
  , ghcMinor :: Int
  } deriving (Eq, Ord, Show, Generic)

-- | Snapshot reference
data Snapshot
  = LTS LTSVersion
  | Nightly NightlyVersion
  deriving (Eq, Ord, Show, Generic)

-- | Outcome of analyzing a snapshot
data Bump
  = UpToDate      -- ^ Already the latest snapshot for its GHC major version
  | BumpTo Text   -- ^ Should be bumped to this snapshot
  | Unknown       -- ^ Snapshot not recognized (e.g. not in the database)
  deriving (Eq, Show, Generic)

-- | Action to take for a stack*.yaml file
data Action = Action
  { actionFile :: FilePath
  , actionOldSnapshot :: Text
  , actionBump :: Bump
  , actionIsResolver :: Bool  -- True if 'resolver' field, False if 'snapshot'
  , actionSpan :: (Int, Int)  -- Character span to replace
  , actionSymlinkTarget :: Maybe FilePath  -- Just target if this is a symlink to another stack*.yaml in the list
  } deriving (Eq, Show, Generic)

-- | Database of snapshots
data SnapshotDB = SnapshotDB
  { dbLTS :: Map LTSVersion GHCVersion
  , dbNightly :: Map NightlyVersion GHCVersion
  , dbGHC :: Map GHCVersion Snapshot
  } deriving (Eq, Show, Generic)

-- | Configuration
data AppConfig = AppConfig
  { configRepo :: Maybe FilePath
  } deriving (Eq, Show, Generic)

-- | Command-line command
data Command
  = Bump [FilePath] Bool  -- Optional list of files to bump, recursive flag
  | DryRun [FilePath] Bool  -- Optional list of files to check, recursive flag
  | Config ConfigCmd
  | Update
  | Info InfoCmd
  | Version
  | NumericVersion
  | PrintLicense
  | Help
  deriving (Eq, Show)

-- | Info command
data InfoCmd
  = InfoAll        -- ^ Print repo path and snapshots (in YAML format)
  | InfoRepo       -- ^ Print just the repo path
  | InfoSnapshots  -- ^ Print just the GHC version to snapshot mapping
  deriving (Eq, Show)

-- | Config command
data ConfigCmd
  = SetRepo FilePath
  deriving (Eq, Show)

-- | Color option
data ColorWhen
  = Always
  | Never
  | Auto
  deriving (Eq, Show, Read)

-- | Options
data Options = Options
  { optCommand :: Command
  , optColor :: ColorWhen
  } deriving (Eq, Show)

-- | Application version
appVersion :: String
appVersion = showVersion Paths.version

-- | Application name
appName :: String
appName = "stacker"

-- | Copyright information
copyright :: String
copyright = "Copyright (c) 2025 Andreas Abel"