packages feed

morley-1.17.0: src/Morley/Tezos/Address/Alias.hs

-- SPDX-FileCopyrightText: 2022 Oxhead Alpha
-- SPDX-License-Identifier: LicenseRef-MIT-OA

module Morley.Tezos.Address.Alias
  ( AddressOrAlias(..)
  , Alias(..)
  )
  where

import Data.Aeson (FromJSON, ToJSON)
import Fmt (Buildable(..))
import Options.Applicative qualified as Opt

import Morley.Tezos.Address (Address, parseAddress)
import Morley.Util.CLI (HasCLReader(..))

-- | @tezos-client@ can associate addresses with textual aliases.
-- This type denotes such an alias.
newtype Alias = Alias
  { unAlias :: Text
    -- ^ Extract 'Text' from 'Alias'.
  }
  deriving stock (Show, Eq, Ord)
  deriving newtype (Buildable, ToJSON, FromJSON)

-- | Representation of an address that @tezos-client@ uses. It can be
-- an address itself or a textual alias.
data AddressOrAlias
  = AddressResolved Address
  -- ^ Address itself, can be used as is.
  | AddressAlias Alias
  -- ^ Address alias, should be resolved by @tezos-client@.
  deriving stock (Show, Eq, Ord)

instance HasCLReader AddressOrAlias where
  getReader =
    Opt.str <&> \addrOrAlias ->
      case parseAddress addrOrAlias of
        Right addr -> AddressResolved addr
        Left _ -> AddressAlias (Alias addrOrAlias)
  getMetavar = "ADDRESS OR ALIAS"

instance Buildable AddressOrAlias where
  build = \case
    AddressResolved addr -> build addr
    AddressAlias alias -> build alias