-- | Michelson contract in untyped model. module Michelson.Untyped.Contract ( Parameter , Storage , Contract' (..) ) where import Data.Aeson.TH (defaultOptions, 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 (Type) type Parameter = Type type Storage = Type data Contract' op = Contract { para :: Parameter , stor :: Storage , code :: [op] } deriving stock (Eq, Show, Functor, Data, Generic) 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 defaultOptions ''Contract'