packages feed

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'