packages feed

henforcer-1.0.0.0: src/Henforcer/CodeStructure/Import/Scheme/PackageQualifier.hs

{- |
Module      : Henforcer.CodeStructure.Import.Scheme.PackageQualified
Description : Models the representation of a package qualifier portion of an import statement.
Copyright   : (c) Flipstone Technology Partners, 2023-2026
License     : MIT
Maintainer  : maintainers@flipstone.com
-}
module Henforcer.CodeStructure.Import.Scheme.PackageQualifier
  ( PackageQualifier (..)
  , packageQualifierCodec
  , determinePackageQualifier
  , keepPackageNameOnly
  ) where

import qualified Data.Text as T
import qualified Toml

import qualified CompatGHC

{- | Directly represent if an import has a package qualifier or not.

@since 1.0.0.0
-}
data PackageQualifier
  = WithPackageQualifier !T.Text
  | WithoutPackageQualifier
  deriving (Eq, Show)

maybeFromPackageQualifier :: PackageQualifier -> Maybe T.Text
maybeFromPackageQualifier WithoutPackageQualifier = Nothing
maybeFromPackageQualifier (WithPackageQualifier x) = Just x

packageQualifierCodec :: Toml.Key -> Toml.TomlCodec PackageQualifier
{-# INLINEABLE packageQualifierCodec #-}
packageQualifierCodec =
  Toml.dimatch maybeFromPackageQualifier WithPackageQualifier . Toml.text

{- | Compute the packageQualifier from an import

@since 1.0.0.0
-}
determinePackageQualifier :: CompatGHC.ImportDecl CompatGHC.GhcRn -> PackageQualifier
determinePackageQualifier idecl =
  case CompatGHC.ideclPkgQual idecl of
    CompatGHC.NoPkgQual -> WithoutPackageQualifier
    CompatGHC.ThisPkg u -> WithPackageQualifier (T.pack $ CompatGHC.unitIdString u)
    CompatGHC.OtherPkg u -> WithPackageQualifier (T.pack $ CompatGHC.unitIdString u)

keepPackageNameOnly :: T.Text -> Maybe T.Text
keepPackageNameOnly =
  headMay . T.split (== '-')

headMay :: [a] -> Maybe a
headMay [] = Nothing
headMay (x : _) = Just x