module Data.Registry.Aeson.TH.ThOptions where

import Data.Text qualified as T
import Protolude

-- | Options used to adjust the creation of encoders/decoders
newtype ThOptions = ThOptions
  { ThOptions -> Text -> Text
modifyTypeName :: Text -> Text
  }

-- | Default options for adjusting the creation of Encoders/Decoders
defaultThOptions :: ThOptions
defaultThOptions :: ThOptions
defaultThOptions = (Text -> Text) -> ThOptions
ThOptions Text -> Text
dropQualifier

-- | Drop the leading names in a qualified name

---  dropQualifier "x.y.z" === "z"
dropQualifier :: Text -> Text
dropQualifier :: Text -> Text
dropQualifier Text
t = Text -> Maybe Text -> Text
forall a. a -> Maybe a -> a
fromMaybe Text
t (Maybe Text -> Text) -> ([Text] -> Maybe Text) -> [Text] -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Text] -> Maybe Text
forall a. [a] -> Maybe a
lastMay ([Text] -> Text) -> [Text] -> Text
forall a b. (a -> b) -> a -> b
$ HasCallStack => Text -> Text -> [Text]
Text -> Text -> [Text]
T.splitOn Text
"." Text
t

-- | This function does not modify type names
qualified :: Text -> Text
qualified :: Text -> Text
qualified = Text -> Text
forall a. a -> a
identity

-- | Provide a specific qualifier to produce type names

---  qualifyAs "a" "x.y.z" === "a.z"
qualifyAs :: Text -> Text -> Text
qualifyAs :: Text -> Text -> Text
qualifyAs Text
qualifier Text
t = Text
qualifier Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"." Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text -> Text
dropQualifier Text
t

-- | Keep the last name as the qualifier

---  qualifyWithLastName "x.y.z" === "y.z"
qualifyWithLastName :: Text -> Text
qualifyWithLastName :: Text -> Text
qualifyWithLastName Text
t =
  case [Text] -> [Text]
forall a. [a] -> [a]
reverse ([Text] -> [Text]) -> [Text] -> [Text]
forall a b. (a -> b) -> a -> b
$ HasCallStack => Text -> Text -> [Text]
Text -> Text -> [Text]
T.splitOn Text
"." Text
t of
    Text
t1 : Text
t2 : [Text]
_ -> Text
t2 Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"." Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
t1
    [Text]
_ -> Text
t