From 6880db4d116b0ff5f4832b8bf16e20652c7d9fd4 Mon Sep 17 00:00:00 2001 From: alari Date: Sat, 8 Sep 2018 00:12:56 +0200 Subject: [PATCH] + Mapping types + public/indexed as tags - Lost the check for public/indexed --- .scalafmt.conf | 60 +++++++++++++++++++ project/plugins.sbt | 1 + .../fluence/hackethberlin/MakeVyperApp.scala | 14 +++-- .../hackethberlin/types/DataVyper.scala | 25 +++++++- .../fluence/hackethberlin/types/Mapping.scala | 5 ++ .../hackethberlin/types/ModifiedType.scala | 11 ---- .../hackethberlin/types/PrimitiveType.scala | 16 +++-- .../hackethberlin/types/StructType.scala | 6 +- .../fluence/hackethberlin/types/Type.scala | 4 +- .../fluence/hackethberlin/types/package.scala | 10 +++- 10 files changed, 120 insertions(+), 32 deletions(-) create mode 100644 .scalafmt.conf create mode 100644 project/plugins.sbt create mode 100644 src/main/scala/fluence/hackethberlin/types/Mapping.scala delete mode 100644 src/main/scala/fluence/hackethberlin/types/ModifiedType.scala diff --git a/.scalafmt.conf b/.scalafmt.conf new file mode 100644 index 0000000..b16fd69 --- /dev/null +++ b/.scalafmt.conf @@ -0,0 +1,60 @@ +docstrings = JavaDoc + +maxColumn = 120 + +align = none +align { + openParenCallSite = false + openParenDefnSite = false + tokens = [ + "%", "%%", "%%%", ":=", "~=" + ] +} + +assumeStandardLibraryStripMargin = true +includeCurlyBraceInSelectChains = false + +continuationIndent { + callSite = 2 + defnSite = 2 + extendSite = 4 +} + +danglingParentheses = true + +newlines { + alwaysBeforeTopLevelStatements = true + sometimesBeforeColonInMethodReturnType = true + penalizeSingleSelectMultiArgList = false + alwaysBeforeElseAfterCurlyIf = false + neverInResultType = false +} + +spaces { + afterKeywordBeforeParen = true +} + +binPack { + parentConstructors = true + literalArgumentLists = true +} + +optIn { + breaksInsideChains = false + breakChainOnFirstMethodDot = true + configStyleArguments = true +} + +runner { + optimizer { + forceConfigStyleOnOffset = 150 + forceConfigStyleMinArgCount = 2 + } +} + +rewrite { + rules = [ + SortImports + ] +} + diff --git a/project/plugins.sbt b/project/plugins.sbt new file mode 100644 index 0000000..f891177 --- /dev/null +++ b/project/plugins.sbt @@ -0,0 +1 @@ +addSbtPlugin("com.geirsson" % "sbt-scalafmt" % "1.4.0") \ No newline at end of file diff --git a/src/main/scala/fluence/hackethberlin/MakeVyperApp.scala b/src/main/scala/fluence/hackethberlin/MakeVyperApp.scala index 6cb9e9b..b34c6c2 100644 --- a/src/main/scala/fluence/hackethberlin/MakeVyperApp.scala +++ b/src/main/scala/fluence/hackethberlin/MakeVyperApp.scala @@ -5,19 +5,21 @@ import types._ object MakeVyperApp extends App { - val data = new DataDef( - ("address" → address) :: - ("owner" → `public`(address)) :: HNil - ) - val struct = new StructType( - "someStruct", ("address" → address) :: ("owner" → address) :: ("size" -> uint256) :: ("time" -> int128) :: HNil ) + val data = new DataDef( + ("address" → address) :: + ("owner" → `public`(address)) :: + ("holders" → (address ~>> bool)) :: + ("struct" → `public`(struct)) :: HNil + ) + + println(data.toVyper) println(struct.toVyper) diff --git a/src/main/scala/fluence/hackethberlin/types/DataVyper.scala b/src/main/scala/fluence/hackethberlin/types/DataVyper.scala index 5db1c8b..a6d9aa6 100644 --- a/src/main/scala/fluence/hackethberlin/types/DataVyper.scala +++ b/src/main/scala/fluence/hackethberlin/types/DataVyper.scala @@ -1,12 +1,13 @@ package fluence.hackethberlin.types -import shapeless.{::, HList, HNil} +import shapeless._ +import shapeless.tag._ sealed trait DataVyper[T] { def toVyperDefinitions(data: T): List[String] } -object DataVyper { +sealed trait LowPriorityDataVyperImplicits { implicit object hnilDataVyper extends DataVyper[HNil] { override def toVyperDefinitions(data: HNil): List[String] = Nil @@ -26,3 +27,23 @@ object DataVyper { } } } + +object DataVyper extends LowPriorityDataVyperImplicits { + + implicit def pairDataPublicVyper[T <: Type]: DataVyper[(String, T @@ Public)] = + new DataVyper[(String, T @@ Public)] { + override def toVyperDefinitions(pair: (String, T @@ Public)): List[String] = { + val (name, ttype) = pair + s"$name: public(${ttype.toVyper})" :: Nil + } + } + + implicit def pairDataIndexedVyper[T <: Type]: DataVyper[(String, T @@ Indexed)] = + new DataVyper[(String, T @@ Indexed)] { + override def toVyperDefinitions(pair: (String, T @@ Indexed)): List[String] = { + val (name, ttype) = pair + s"$name: indexed(${ttype.toVyper})" :: Nil + } + } + +} diff --git a/src/main/scala/fluence/hackethberlin/types/Mapping.scala b/src/main/scala/fluence/hackethberlin/types/Mapping.scala new file mode 100644 index 0000000..ac9356c --- /dev/null +++ b/src/main/scala/fluence/hackethberlin/types/Mapping.scala @@ -0,0 +1,5 @@ +package fluence.hackethberlin.types + +case class Mapping[K <: PrimitiveType, V <: Type](ktype: K, vtype: V) extends Type { + override def toVyper: String = s"${vtype.toVyper}[${ktype.toVyper}]" +} diff --git a/src/main/scala/fluence/hackethberlin/types/ModifiedType.scala b/src/main/scala/fluence/hackethberlin/types/ModifiedType.scala deleted file mode 100644 index e732af2..0000000 --- a/src/main/scala/fluence/hackethberlin/types/ModifiedType.scala +++ /dev/null @@ -1,11 +0,0 @@ -package fluence.hackethberlin.types - -case class ModifiedType[T <: Type](modifier: String, ttype: T) extends Type { - override def toVyper: String = s"$modifier(${ttype.toVyper})" -} - -object ModifiedType { - trait Defs { - def `public`[T <: Type](ttype: T): ModifiedType[T] = ModifiedType("public", ttype) - } -} diff --git a/src/main/scala/fluence/hackethberlin/types/PrimitiveType.scala b/src/main/scala/fluence/hackethberlin/types/PrimitiveType.scala index 1026420..e4a436c 100644 --- a/src/main/scala/fluence/hackethberlin/types/PrimitiveType.scala +++ b/src/main/scala/fluence/hackethberlin/types/PrimitiveType.scala @@ -1,15 +1,19 @@ package fluence.hackethberlin.types -abstract sealed class PrimitiveType(name: String) extends PlainType { +abstract sealed class PrimitiveType(name: String) extends Type { + self ⇒ + override def toVyper: String = name + + def ~>>[V <: Type](vtype: V): Mapping[self.type, V] = Mapping(self, vtype) } object PrimitiveType { trait Defs { - object address extends PrimitiveType("address") - object bool extends PrimitiveType("bool") - object int128 extends PrimitiveType("int128") - object uint256 extends PrimitiveType("uint256") - object decimal extends PrimitiveType("decimal") + case object address extends PrimitiveType("address") + case object bool extends PrimitiveType("bool") + case object int128 extends PrimitiveType("int128") + case object uint256 extends PrimitiveType("uint256") + case object decimal extends PrimitiveType("decimal") } } \ No newline at end of file diff --git a/src/main/scala/fluence/hackethberlin/types/StructType.scala b/src/main/scala/fluence/hackethberlin/types/StructType.scala index 1e57b4b..4d9d415 100644 --- a/src/main/scala/fluence/hackethberlin/types/StructType.scala +++ b/src/main/scala/fluence/hackethberlin/types/StructType.scala @@ -1,7 +1,7 @@ package fluence.hackethberlin.types -import shapeless.{HList, LUBConstraint} +import shapeless.HList -class StructType[D <: HList](name: String, dataDef: D)(implicit dv: DataVyper[D], c: LUBConstraint[D, (String, PlainType)]) extends PlainType { - override def toVyper: String = s"$name: {${dv.toVyperDefinitions(dataDef).mkString(", ")}}" +class StructType[D <: HList](dataDef: D)(implicit dv: DataVyper[D]) extends Type { + override def toVyper: String = s"{${dv.toVyperDefinitions(dataDef).mkString(", ")}}" } diff --git a/src/main/scala/fluence/hackethberlin/types/Type.scala b/src/main/scala/fluence/hackethberlin/types/Type.scala index 1fbe8ea..c08dc98 100644 --- a/src/main/scala/fluence/hackethberlin/types/Type.scala +++ b/src/main/scala/fluence/hackethberlin/types/Type.scala @@ -2,6 +2,4 @@ package fluence.hackethberlin.types trait Type { def toVyper: String -} - -trait PlainType extends Type \ No newline at end of file +} \ No newline at end of file diff --git a/src/main/scala/fluence/hackethberlin/types/package.scala b/src/main/scala/fluence/hackethberlin/types/package.scala index 7a94516..dbd37e6 100644 --- a/src/main/scala/fluence/hackethberlin/types/package.scala +++ b/src/main/scala/fluence/hackethberlin/types/package.scala @@ -1,3 +1,11 @@ package fluence.hackethberlin -package object types extends PrimitiveType.Defs with ModifiedType.Defs {} +import shapeless.tag + +package object types extends PrimitiveType.Defs { + sealed trait Public + sealed trait Indexed + + val `public`: tag.Tagger[Public] = tag[Public] + val indexed: tag.Tagger[Indexed] = tag[Indexed] +}