From 27740833d5bfe0fb563e09311d8f3229f5434ef7 Mon Sep 17 00:00:00 2001 From: alari Date: Sat, 8 Sep 2018 11:42:13 +0200 Subject: [PATCH] Function definitions with Decorators --- build.sbt | 2 +- .../scala/fluence/hackethberlin/Decorator.scala | 11 +++++++++++ .../scala/fluence/hackethberlin/FuncDef.scala | 17 +++++++++++++++++ .../fluence/hackethberlin/MakeVyperApp.scala | 10 ++++++++++ .../fluence/hackethberlin/types/DataVyper.scala | 5 +++++ 5 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 src/main/scala/fluence/hackethberlin/Decorator.scala create mode 100644 src/main/scala/fluence/hackethberlin/FuncDef.scala diff --git a/build.sbt b/build.sbt index ba604af..2171c14 100644 --- a/build.sbt +++ b/build.sbt @@ -13,7 +13,7 @@ startYear := Some(2018) licenses += ("Apache-2.0", new URL("https://www.apache.org/licenses/LICENSE-2.0.txt")) //headerLicense := Some(License.ALv2("2018", organizationName.value)) resolvers += Resolver.bintrayRepo("fluencelabs", "releases") -//scalafmtOnCompile := true, +scalafmtOnCompile := true // see good explanation https://gist.github.com/djspiewak/7a81a395c461fd3a09a6941d4cd040f2 scalacOptions += "-Ypartial-unification" diff --git a/src/main/scala/fluence/hackethberlin/Decorator.scala b/src/main/scala/fluence/hackethberlin/Decorator.scala new file mode 100644 index 0000000..8736bc5 --- /dev/null +++ b/src/main/scala/fluence/hackethberlin/Decorator.scala @@ -0,0 +1,11 @@ +package fluence.hackethberlin + +sealed abstract class Decorator(name: String) { + def toVyper: String = s"@$name" +} + +object Decorator { + case object `@public` extends Decorator("public") + case object `@payable` extends Decorator("payable") + case object `@constant` extends Decorator("constant") +} diff --git a/src/main/scala/fluence/hackethberlin/FuncDef.scala b/src/main/scala/fluence/hackethberlin/FuncDef.scala new file mode 100644 index 0000000..36533dc --- /dev/null +++ b/src/main/scala/fluence/hackethberlin/FuncDef.scala @@ -0,0 +1,17 @@ +package fluence.hackethberlin + +import fluence.hackethberlin.types.DataVyper +import shapeless._ + +class FuncDef[Args <: HList: DataVyper]( + name: String, + argsDef: Args, + decorators: Set[Decorator] = Set.empty +) { + + def toVyper: String = + s"${decorators.map(_.toVyper).mkString("\n")}\ndef $name(${DataVyper[Args].mkString(argsDef, ", ")}):\n body;\n" + + def @:(decorator: Decorator): FuncDef[Args] = + new FuncDef[Args](name, argsDef, decorators + decorator) +} diff --git a/src/main/scala/fluence/hackethberlin/MakeVyperApp.scala b/src/main/scala/fluence/hackethberlin/MakeVyperApp.scala index 4fd04aa..b75be29 100644 --- a/src/main/scala/fluence/hackethberlin/MakeVyperApp.scala +++ b/src/main/scala/fluence/hackethberlin/MakeVyperApp.scala @@ -2,6 +2,7 @@ package fluence.hackethberlin import shapeless._ import types._ +import Decorator._ object MakeVyperApp extends App { @@ -21,6 +22,15 @@ object MakeVyperApp extends App { ("struct2" → struct) :: HNil ) + val func = new FuncDef( + "myFunc", + ("address" → address) :: HNil + ) + println(data.toVyper) + println(func.toVyper) + + println((`@public` @: func).toVyper) + } \ No newline at end of file diff --git a/src/main/scala/fluence/hackethberlin/types/DataVyper.scala b/src/main/scala/fluence/hackethberlin/types/DataVyper.scala index a6d9aa6..5ccb509 100644 --- a/src/main/scala/fluence/hackethberlin/types/DataVyper.scala +++ b/src/main/scala/fluence/hackethberlin/types/DataVyper.scala @@ -5,6 +5,9 @@ import shapeless.tag._ sealed trait DataVyper[T] { def toVyperDefinitions(data: T): List[String] + + def mkString(data: T, sep: String): String = + toVyperDefinitions(data).mkString(sep) } sealed trait LowPriorityDataVyperImplicits { @@ -30,6 +33,8 @@ sealed trait LowPriorityDataVyperImplicits { object DataVyper extends LowPriorityDataVyperImplicits { + def apply[T](implicit dataVyper: DataVyper[T]): DataVyper[T] = dataVyper + implicit def pairDataPublicVyper[T <: Type]: DataVyper[(String, T @@ Public)] = new DataVyper[(String, T @@ Public)] { override def toVyperDefinitions(pair: (String, T @@ Public)): List[String] = {