-- | 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'