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

-- | Michelson view.
module Morley.Michelson.Untyped.View
  ( ViewName (.., ViewName)
  , mkViewName
  , BadViewNameError (..)
  , isValidViewNameChar
  , viewNameMaxLength
  , renderViewName
  , viewNameToMText

  , View' (..)
  ) where

import Control.Monad.Except (throwError)
import Data.Aeson.TH (deriveJSON)
import Data.Data (Data)
import Data.Text qualified as Text
import Fmt (Buildable(..), (+|), (|+))
import Text.PrettyPrint.Leijen.Text (Doc, dquotes, textStrict)

import Morley.Michelson.Printer.Util
import Morley.Michelson.Text
import Morley.Michelson.Untyped.Type
import Morley.Util.Aeson

-- | Name of the view.
--
-- 1. It must not exceed 31 chars length;
-- 2. Must use [a-zA-Z0-9_.%@] charset.
newtype ViewName = UnsafeViewName { ViewName -> Text
unViewName :: Text }
  deriving stock (Int -> ViewName -> ShowS
[ViewName] -> ShowS
ViewName -> [Char]
(Int -> ViewName -> ShowS)
-> (ViewName -> [Char]) -> ([ViewName] -> ShowS) -> Show ViewName
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [ViewName] -> ShowS
$cshowList :: [ViewName] -> ShowS
show :: ViewName -> [Char]
$cshow :: ViewName -> [Char]
showsPrec :: Int -> ViewName -> ShowS
$cshowsPrec :: Int -> ViewName -> ShowS
Show, ViewName -> ViewName -> Bool
(ViewName -> ViewName -> Bool)
-> (ViewName -> ViewName -> Bool) -> Eq ViewName
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ViewName -> ViewName -> Bool
$c/= :: ViewName -> ViewName -> Bool
== :: ViewName -> ViewName -> Bool
$c== :: ViewName -> ViewName -> Bool
Eq, Eq ViewName
Eq ViewName
-> (ViewName -> ViewName -> Ordering)
-> (ViewName -> ViewName -> Bool)
-> (ViewName -> ViewName -> Bool)
-> (ViewName -> ViewName -> Bool)
-> (ViewName -> ViewName -> Bool)
-> (ViewName -> ViewName -> ViewName)
-> (ViewName -> ViewName -> ViewName)
-> Ord ViewName
ViewName -> ViewName -> Bool
ViewName -> ViewName -> Ordering
ViewName -> ViewName -> ViewName
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ViewName -> ViewName -> ViewName
$cmin :: ViewName -> ViewName -> ViewName
max :: ViewName -> ViewName -> ViewName
$cmax :: ViewName -> ViewName -> ViewName
>= :: ViewName -> ViewName -> Bool
$c>= :: ViewName -> ViewName -> Bool
> :: ViewName -> ViewName -> Bool
$c> :: ViewName -> ViewName -> Bool
<= :: ViewName -> ViewName -> Bool
$c<= :: ViewName -> ViewName -> Bool
< :: ViewName -> ViewName -> Bool
$c< :: ViewName -> ViewName -> Bool
compare :: ViewName -> ViewName -> Ordering
$ccompare :: ViewName -> ViewName -> Ordering
Ord, Typeable ViewName
Typeable ViewName
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> ViewName -> c ViewName)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c ViewName)
-> (ViewName -> Constr)
-> (ViewName -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c ViewName))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c ViewName))
-> ((forall b. Data b => b -> b) -> ViewName -> ViewName)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> ViewName -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> ViewName -> r)
-> (forall u. (forall d. Data d => d -> u) -> ViewName -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> ViewName -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> ViewName -> m ViewName)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> ViewName -> m ViewName)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> ViewName -> m ViewName)
-> Data ViewName
ViewName -> DataType
ViewName -> Constr
(forall b. Data b => b -> b) -> ViewName -> ViewName
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> ViewName -> u
forall u. (forall d. Data d => d -> u) -> ViewName -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ViewName -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ViewName -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> ViewName -> m ViewName
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ViewName -> m ViewName
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c ViewName
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ViewName -> c ViewName
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c ViewName)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c ViewName)
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ViewName -> m ViewName
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ViewName -> m ViewName
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ViewName -> m ViewName
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ViewName -> m ViewName
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> ViewName -> m ViewName
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> ViewName -> m ViewName
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> ViewName -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> ViewName -> u
gmapQ :: forall u. (forall d. Data d => d -> u) -> ViewName -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> ViewName -> [u]
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ViewName -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ViewName -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ViewName -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ViewName -> r
gmapT :: (forall b. Data b => b -> b) -> ViewName -> ViewName
$cgmapT :: (forall b. Data b => b -> b) -> ViewName -> ViewName
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c ViewName)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c ViewName)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c ViewName)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c ViewName)
dataTypeOf :: ViewName -> DataType
$cdataTypeOf :: ViewName -> DataType
toConstr :: ViewName -> Constr
$ctoConstr :: ViewName -> Constr
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c ViewName
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c ViewName
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ViewName -> c ViewName
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ViewName -> c ViewName
Data, (forall x. ViewName -> Rep ViewName x)
-> (forall x. Rep ViewName x -> ViewName) -> Generic ViewName
forall x. Rep ViewName x -> ViewName
forall x. ViewName -> Rep ViewName x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep ViewName x -> ViewName
$cfrom :: forall x. ViewName -> Rep ViewName x
Generic)
  deriving newtype (ViewName -> Builder
(ViewName -> Builder) -> Buildable ViewName
forall p. (p -> Builder) -> Buildable p
build :: ViewName -> Builder
$cbuild :: ViewName -> Builder
Buildable, ViewName -> ()
(ViewName -> ()) -> NFData ViewName
forall a. (a -> ()) -> NFData a
rnf :: ViewName -> ()
$crnf :: ViewName -> ()
NFData)

pattern ViewName :: Text -> ViewName
pattern $mViewName :: forall {r}. ViewName -> (Text -> r) -> (Void# -> r) -> r
ViewName name <- UnsafeViewName name
{-# COMPLETE ViewName #-}

-- | Whether the given character is valid for a view.
isValidViewNameChar :: Char -> Bool
isValidViewNameChar :: Char -> Bool
isValidViewNameChar Char
c = [Bool] -> Bool
forall t. (Container t, Element t ~ Bool) => t -> Bool
or
  [ Char
'A' Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
c Bool -> Bool -> Bool
forall a. Boolean a => a -> a -> a
&& Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
'Z'
  , Char
'a' Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
c Bool -> Bool -> Bool
forall a. Boolean a => a -> a -> a
&& Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
'z'
  , Char
'0' Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
c Bool -> Bool -> Bool
forall a. Boolean a => a -> a -> a
&& Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
'9'
  , Char
Element [Char]
c Element [Char] -> [Char] -> Bool
forall t. (Container t, Eq (Element t)) => Element t -> t -> Bool
`elem` [Char
'_', Char
'.', Char
'%', Char
'@']
  ]

-- | Maximum allowed name length for a view.
viewNameMaxLength :: Int
viewNameMaxLength :: Int
viewNameMaxLength = Int
31

data BadViewNameError
  = BadViewTooLong Int
  | BadViewIllegalChars Text
  deriving stock (Int -> BadViewNameError -> ShowS
[BadViewNameError] -> ShowS
BadViewNameError -> [Char]
(Int -> BadViewNameError -> ShowS)
-> (BadViewNameError -> [Char])
-> ([BadViewNameError] -> ShowS)
-> Show BadViewNameError
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [BadViewNameError] -> ShowS
$cshowList :: [BadViewNameError] -> ShowS
show :: BadViewNameError -> [Char]
$cshow :: BadViewNameError -> [Char]
showsPrec :: Int -> BadViewNameError -> ShowS
$cshowsPrec :: Int -> BadViewNameError -> ShowS
Show, BadViewNameError -> BadViewNameError -> Bool
(BadViewNameError -> BadViewNameError -> Bool)
-> (BadViewNameError -> BadViewNameError -> Bool)
-> Eq BadViewNameError
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: BadViewNameError -> BadViewNameError -> Bool
$c/= :: BadViewNameError -> BadViewNameError -> Bool
== :: BadViewNameError -> BadViewNameError -> Bool
$c== :: BadViewNameError -> BadViewNameError -> Bool
Eq, Eq BadViewNameError
Eq BadViewNameError
-> (BadViewNameError -> BadViewNameError -> Ordering)
-> (BadViewNameError -> BadViewNameError -> Bool)
-> (BadViewNameError -> BadViewNameError -> Bool)
-> (BadViewNameError -> BadViewNameError -> Bool)
-> (BadViewNameError -> BadViewNameError -> Bool)
-> (BadViewNameError -> BadViewNameError -> BadViewNameError)
-> (BadViewNameError -> BadViewNameError -> BadViewNameError)
-> Ord BadViewNameError
BadViewNameError -> BadViewNameError -> Bool
BadViewNameError -> BadViewNameError -> Ordering
BadViewNameError -> BadViewNameError -> BadViewNameError
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: BadViewNameError -> BadViewNameError -> BadViewNameError
$cmin :: BadViewNameError -> BadViewNameError -> BadViewNameError
max :: BadViewNameError -> BadViewNameError -> BadViewNameError
$cmax :: BadViewNameError -> BadViewNameError -> BadViewNameError
>= :: BadViewNameError -> BadViewNameError -> Bool
$c>= :: BadViewNameError -> BadViewNameError -> Bool
> :: BadViewNameError -> BadViewNameError -> Bool
$c> :: BadViewNameError -> BadViewNameError -> Bool
<= :: BadViewNameError -> BadViewNameError -> Bool
$c<= :: BadViewNameError -> BadViewNameError -> Bool
< :: BadViewNameError -> BadViewNameError -> Bool
$c< :: BadViewNameError -> BadViewNameError -> Bool
compare :: BadViewNameError -> BadViewNameError -> Ordering
$ccompare :: BadViewNameError -> BadViewNameError -> Ordering
Ord, Typeable BadViewNameError
Typeable BadViewNameError
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> BadViewNameError -> c BadViewNameError)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c BadViewNameError)
-> (BadViewNameError -> Constr)
-> (BadViewNameError -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c BadViewNameError))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e))
    -> Maybe (c BadViewNameError))
-> ((forall b. Data b => b -> b)
    -> BadViewNameError -> BadViewNameError)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> BadViewNameError -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> BadViewNameError -> r)
-> (forall u.
    (forall d. Data d => d -> u) -> BadViewNameError -> [u])
-> (forall u.
    Int -> (forall d. Data d => d -> u) -> BadViewNameError -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d)
    -> BadViewNameError -> m BadViewNameError)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d)
    -> BadViewNameError -> m BadViewNameError)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d)
    -> BadViewNameError -> m BadViewNameError)
-> Data BadViewNameError
BadViewNameError -> DataType
BadViewNameError -> Constr
(forall b. Data b => b -> b)
-> BadViewNameError -> BadViewNameError
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u.
Int -> (forall d. Data d => d -> u) -> BadViewNameError -> u
forall u. (forall d. Data d => d -> u) -> BadViewNameError -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> BadViewNameError -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> BadViewNameError -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d)
-> BadViewNameError -> m BadViewNameError
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> BadViewNameError -> m BadViewNameError
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c BadViewNameError
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> BadViewNameError -> c BadViewNameError
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c BadViewNameError)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c BadViewNameError)
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> BadViewNameError -> m BadViewNameError
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> BadViewNameError -> m BadViewNameError
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> BadViewNameError -> m BadViewNameError
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> BadViewNameError -> m BadViewNameError
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d)
-> BadViewNameError -> m BadViewNameError
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d)
-> BadViewNameError -> m BadViewNameError
gmapQi :: forall u.
Int -> (forall d. Data d => d -> u) -> BadViewNameError -> u
$cgmapQi :: forall u.
Int -> (forall d. Data d => d -> u) -> BadViewNameError -> u
gmapQ :: forall u. (forall d. Data d => d -> u) -> BadViewNameError -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> BadViewNameError -> [u]
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> BadViewNameError -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> BadViewNameError -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> BadViewNameError -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> BadViewNameError -> r
gmapT :: (forall b. Data b => b -> b)
-> BadViewNameError -> BadViewNameError
$cgmapT :: (forall b. Data b => b -> b)
-> BadViewNameError -> BadViewNameError
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c BadViewNameError)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c BadViewNameError)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c BadViewNameError)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c BadViewNameError)
dataTypeOf :: BadViewNameError -> DataType
$cdataTypeOf :: BadViewNameError -> DataType
toConstr :: BadViewNameError -> Constr
$ctoConstr :: BadViewNameError -> Constr
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c BadViewNameError
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c BadViewNameError
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> BadViewNameError -> c BadViewNameError
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> BadViewNameError -> c BadViewNameError
Data, (forall x. BadViewNameError -> Rep BadViewNameError x)
-> (forall x. Rep BadViewNameError x -> BadViewNameError)
-> Generic BadViewNameError
forall x. Rep BadViewNameError x -> BadViewNameError
forall x. BadViewNameError -> Rep BadViewNameError x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep BadViewNameError x -> BadViewNameError
$cfrom :: forall x. BadViewNameError -> Rep BadViewNameError x
Generic)
  deriving anyclass (BadViewNameError -> ()
(BadViewNameError -> ()) -> NFData BadViewNameError
forall a. (a -> ()) -> NFData a
rnf :: BadViewNameError -> ()
$crnf :: BadViewNameError -> ()
NFData)

instance Buildable BadViewNameError where
  build :: BadViewNameError -> Builder
build = \case
    BadViewTooLong Int
l ->
      Builder
"Bad view name length of " Builder -> Builder -> Builder
forall b. FromBuilder b => Builder -> Builder -> b
+| Int
l Int -> Builder -> Builder
forall a b. (Buildable a, FromBuilder b) => a -> Builder -> b
|+ Builder
" characters, must not exceed \
      \" Builder -> Builder -> Builder
forall b. FromBuilder b => Builder -> Builder -> b
+| Int
viewNameMaxLength Int -> Builder -> Builder
forall a b. (Buildable a, FromBuilder b) => a -> Builder -> b
|+ Builder
" characters length"
    BadViewIllegalChars Text
txt ->
      Builder
"Invalid characters in the view \"" Builder -> Builder -> Builder
forall b. FromBuilder b => Builder -> Builder -> b
+| Text
txt Text -> Builder -> Builder
forall a b. (Buildable a, FromBuilder b) => a -> Builder -> b
|+ Builder
", allowed characters set \
      \is [a-zA-Z0-9_.%@]"

-- | Construct t'ViewName' performing all the checks.
mkViewName :: Text -> Either BadViewNameError ViewName
mkViewName :: Text -> Either BadViewNameError ViewName
mkViewName Text
txt = do
  Bool -> Either BadViewNameError () -> Either BadViewNameError ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (Text -> Int
forall t. Container t => t -> Int
length Text
txt Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
viewNameMaxLength) (Either BadViewNameError () -> Either BadViewNameError ())
-> Either BadViewNameError () -> Either BadViewNameError ()
forall a b. (a -> b) -> a -> b
$
    BadViewNameError -> Either BadViewNameError ()
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError (Int -> BadViewNameError
BadViewTooLong (Int -> BadViewNameError) -> Int -> BadViewNameError
forall a b. (a -> b) -> a -> b
$ Text -> Int
forall t. Container t => t -> Int
length Text
txt)
  Bool -> Either BadViewNameError () -> Either BadViewNameError ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless ((Char -> Bool) -> Text -> Bool
Text.all Char -> Bool
isValidViewNameChar Text
txt) (Either BadViewNameError () -> Either BadViewNameError ())
-> Either BadViewNameError () -> Either BadViewNameError ()
forall a b. (a -> b) -> a -> b
$
    BadViewNameError -> Either BadViewNameError ()
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError (Text -> BadViewNameError
BadViewIllegalChars Text
txt)
  return (Text -> ViewName
UnsafeViewName Text
txt)

renderViewName :: ViewName -> Doc
renderViewName :: ViewName -> Doc
renderViewName = Doc -> Doc
dquotes (Doc -> Doc) -> (ViewName -> Doc) -> ViewName -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Doc
textStrict (Text -> Doc) -> (ViewName -> Text) -> ViewName -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ViewName -> Text
unViewName

instance RenderDoc ViewName where
  renderDoc :: RenderContext -> ViewName -> Doc
renderDoc RenderContext
_ = ViewName -> Doc
renderViewName

-- | Valid view names form a subset of valid Michelson texts.
viewNameToMText :: ViewName -> MText
viewNameToMText :: ViewName -> MText
viewNameToMText = Either Text MText -> MText
forall a b. (HasCallStack, Buildable a) => Either a b -> b
unsafe (Either Text MText -> MText)
-> (ViewName -> Either Text MText) -> ViewName -> MText
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Either Text MText
mkMText (Text -> Either Text MText)
-> (ViewName -> Text) -> ViewName -> Either Text MText
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ViewName -> Text
unViewName

-- | Untyped view in a contract.
data View' op = View
  { forall op. View' op -> ViewName
viewName :: ViewName
    -- ^ View name
  , forall op. View' op -> Ty
viewArgument :: Ty
    -- ^ View argument type
  , forall op. View' op -> Ty
viewReturn :: Ty
    -- ^ View return type
  , forall op. View' op -> [op]
viewCode :: [op]
    -- ^ View code
  } deriving stock (View' op -> View' op -> Bool
(View' op -> View' op -> Bool)
-> (View' op -> View' op -> Bool) -> Eq (View' op)
forall op. Eq op => View' op -> View' op -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: View' op -> View' op -> Bool
$c/= :: forall op. Eq op => View' op -> View' op -> Bool
== :: View' op -> View' op -> Bool
$c== :: forall op. Eq op => View' op -> View' op -> Bool
Eq, Int -> View' op -> ShowS
[View' op] -> ShowS
View' op -> [Char]
(Int -> View' op -> ShowS)
-> (View' op -> [Char]) -> ([View' op] -> ShowS) -> Show (View' op)
forall op. Show op => Int -> View' op -> ShowS
forall op. Show op => [View' op] -> ShowS
forall op. Show op => View' op -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [View' op] -> ShowS
$cshowList :: forall op. Show op => [View' op] -> ShowS
show :: View' op -> [Char]
$cshow :: forall op. Show op => View' op -> [Char]
showsPrec :: Int -> View' op -> ShowS
$cshowsPrec :: forall op. Show op => Int -> View' op -> ShowS
Show, (forall a b. (a -> b) -> View' a -> View' b)
-> (forall a b. a -> View' b -> View' a) -> Functor View'
forall a b. a -> View' b -> View' a
forall a b. (a -> b) -> View' a -> View' b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> View' b -> View' a
$c<$ :: forall a b. a -> View' b -> View' a
fmap :: forall a b. (a -> b) -> View' a -> View' b
$cfmap :: forall a b. (a -> b) -> View' a -> View' b
Functor, Typeable (View' op)
Typeable (View' op)
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> View' op -> c (View' op))
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c (View' op))
-> (View' op -> Constr)
-> (View' op -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c (View' op)))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e))
    -> Maybe (c (View' op)))
-> ((forall b. Data b => b -> b) -> View' op -> View' op)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> View' op -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> View' op -> r)
-> (forall u. (forall d. Data d => d -> u) -> View' op -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> View' op -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> View' op -> m (View' op))
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> View' op -> m (View' op))
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> View' op -> m (View' op))
-> Data (View' op)
View' op -> DataType
View' op -> Constr
(forall b. Data b => b -> b) -> View' op -> View' op
forall {op}. Data op => Typeable (View' op)
forall op. Data op => View' op -> DataType
forall op. Data op => View' op -> Constr
forall op.
Data op =>
(forall b. Data b => b -> b) -> View' op -> View' op
forall op u.
Data op =>
Int -> (forall d. Data d => d -> u) -> View' op -> u
forall op u.
Data op =>
(forall d. Data d => d -> u) -> View' op -> [u]
forall op r r'.
Data op =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> View' op -> r
forall op r r'.
Data op =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> View' op -> r
forall op (m :: * -> *).
(Data op, Monad m) =>
(forall d. Data d => d -> m d) -> View' op -> m (View' op)
forall op (m :: * -> *).
(Data op, MonadPlus m) =>
(forall d. Data d => d -> m d) -> View' op -> m (View' op)
forall op (c :: * -> *).
Data op =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (View' op)
forall op (c :: * -> *).
Data op =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> View' op -> c (View' op)
forall op (t :: * -> *) (c :: * -> *).
(Data op, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (View' op))
forall op (t :: * -> * -> *) (c :: * -> *).
(Data op, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (View' op))
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> View' op -> u
forall u. (forall d. Data d => d -> u) -> View' op -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> View' op -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> View' op -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> View' op -> m (View' op)
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> View' op -> m (View' op)
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (View' op)
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> View' op -> c (View' op)
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (View' op))
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (View' op))
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> View' op -> m (View' op)
$cgmapMo :: forall op (m :: * -> *).
(Data op, MonadPlus m) =>
(forall d. Data d => d -> m d) -> View' op -> m (View' op)
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> View' op -> m (View' op)
$cgmapMp :: forall op (m :: * -> *).
(Data op, MonadPlus m) =>
(forall d. Data d => d -> m d) -> View' op -> m (View' op)
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> View' op -> m (View' op)
$cgmapM :: forall op (m :: * -> *).
(Data op, Monad m) =>
(forall d. Data d => d -> m d) -> View' op -> m (View' op)
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> View' op -> u
$cgmapQi :: forall op u.
Data op =>
Int -> (forall d. Data d => d -> u) -> View' op -> u
gmapQ :: forall u. (forall d. Data d => d -> u) -> View' op -> [u]
$cgmapQ :: forall op u.
Data op =>
(forall d. Data d => d -> u) -> View' op -> [u]
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> View' op -> r
$cgmapQr :: forall op r r'.
Data op =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> View' op -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> View' op -> r
$cgmapQl :: forall op r r'.
Data op =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> View' op -> r
gmapT :: (forall b. Data b => b -> b) -> View' op -> View' op
$cgmapT :: forall op.
Data op =>
(forall b. Data b => b -> b) -> View' op -> View' op
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (View' op))
$cdataCast2 :: forall op (t :: * -> * -> *) (c :: * -> *).
(Data op, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (View' op))
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (View' op))
$cdataCast1 :: forall op (t :: * -> *) (c :: * -> *).
(Data op, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (View' op))
dataTypeOf :: View' op -> DataType
$cdataTypeOf :: forall op. Data op => View' op -> DataType
toConstr :: View' op -> Constr
$ctoConstr :: forall op. Data op => View' op -> Constr
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (View' op)
$cgunfold :: forall op (c :: * -> *).
Data op =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (View' op)
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> View' op -> c (View' op)
$cgfoldl :: forall op (c :: * -> *).
Data op =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> View' op -> c (View' op)
Data, (forall x. View' op -> Rep (View' op) x)
-> (forall x. Rep (View' op) x -> View' op) -> Generic (View' op)
forall x. Rep (View' op) x -> View' op
forall x. View' op -> Rep (View' op) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall op x. Rep (View' op) x -> View' op
forall op x. View' op -> Rep (View' op) x
$cto :: forall op x. Rep (View' op) x -> View' op
$cfrom :: forall op x. View' op -> Rep (View' op) x
Generic)

instance NFData op => NFData (View' op)

deriveJSON morleyAesonOptions ''ViewName
deriveJSON morleyAesonOptions ''View'