morley-1.2.0: src/Michelson/Untyped/Contract.hs
-- | Michelson contract in untyped model.
module Michelson.Untyped.Contract
( Storage
, Contract' (..)
) where
import Data.Aeson.TH (deriveJSON)
import Data.Data (Data(..))
import Formatting.Buildable (Buildable(build))
import Text.PrettyPrint.Leijen.Text (nest, semi, (<$$>), (<+>))
import Michelson.Printer.Util
(Prettier(..), RenderDoc(..), assertParensNotNeeded, buildRenderDoc, needsParens, renderOpsList)
import Michelson.Untyped.Type (ParameterType(..), Type(..))
import Util.Aeson
type Storage = Type
data Contract' op = Contract
{ contractParameter :: ParameterType
, contractStorage :: Storage
, contractCode :: [op]
} deriving stock (Eq, Show, Functor, Data, Generic)
instance NFData op => NFData (Contract' op)
instance (RenderDoc op) => RenderDoc (Contract' op) where
renderDoc pn (Contract parameter storage code) = assertParensNotNeeded pn $
"parameter" <+> renderDoc needsParens (Prettier parameter) <> semi <$$>
"storage" <+> renderDoc needsParens (Prettier storage) <> semi <$$>
"code" <+> nest (length ("code {" :: Text)) (renderOpsList False code <> semi)
instance RenderDoc op => Buildable (Contract' op) where
build = buildRenderDoc
deriveJSON morleyAesonOptions ''Contract'