diff --git a/eclair-wire/pom.xml b/eclair-wire/pom.xml new file mode 100644 index 000000000..46f53acc7 --- /dev/null +++ b/eclair-wire/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + + fr.acinq.eclair + eclair_2.11 + 0.2-SNAPSHOT + + + eclair-wire_2.11 + jar + + ${project.artifactId} + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + generate-sources + + add-source + + + + ${project.build.directory}/generated-sources/scala + + + + + + + + + + + org.scodec + scodec-core_${scala.version.short} + + + + diff --git a/eclair-wire/src/main/scala/fr/acinq/eclair/wire/Packet.scala b/eclair-wire/src/main/scala/fr/acinq/eclair/wire/Packet.scala new file mode 100644 index 000000000..880831223 --- /dev/null +++ b/eclair-wire/src/main/scala/fr/acinq/eclair/wire/Packet.scala @@ -0,0 +1,21 @@ +package fr.acinq.eclair.wire + +import fr.acinq.eclair.wire.PacketType._ +import scodec.Codec +import scodec.codecs._ + +/** + * Created by PM on 17/10/2016. + */ +object Packet { + implicit val codec: Codec[Packet] = { + ("packet_type" | Codec[PacketType]) :: + (("data_length" | uint16) >>:~ { length => + ("data" | vectorOfN(provide(length), uint8)).hlist + }) + }.as[Packet] +} + +case class Packet(packetType: PacketType, dataLength: Int, data: Vector[Int]) { + require(dataLength == data.length) +} \ No newline at end of file diff --git a/eclair-wire/src/main/scala/fr/acinq/eclair/wire/PacketType.scala b/eclair-wire/src/main/scala/fr/acinq/eclair/wire/PacketType.scala new file mode 100644 index 000000000..d8d30cc5f --- /dev/null +++ b/eclair-wire/src/main/scala/fr/acinq/eclair/wire/PacketType.scala @@ -0,0 +1,36 @@ +package fr.acinq.eclair.wire + +import scodec.bits.BitVector +import scodec.{Attempt, Codec, DecodeResult, Err, SizeBound} +import scodec.codecs._ + +/** + * Created by PM on 17/10/2016. + */ +object PacketType extends Enumeration { + type PacketType = Value + val ADD = Value(0) + val FAIL = Value(1) + val FULFILL = Value(2) + + implicit val commandTypeCodec: Codec[PacketType] = + mappedEnum(uint(2), PacketType.values.map(v => (v, v.id)).toMap) +} + +import fr.acinq.eclair.wire.PacketType._ + +class PacketTypeCodec() extends Codec[PacketType] { + override def sizeBound = SizeBound.exact(1) + + override def encode(a: PacketType) = Attempt.successful(BitVector.empty) + + override def decode(buffer: BitVector) = + buffer.acquire(1) match { + case Left(e) => Attempt.failure(Err.insufficientBits(1, buffer.size)) + case Right(b) if b(0) == 0 => Attempt.successful(DecodeResult(ADD, buffer)) + case Right(b) if b(0) == 1 => Attempt.successful(DecodeResult(FAIL, buffer)) + case Right(b) if b(0) == 2 => Attempt.successful(DecodeResult(FULFILL, buffer)) + } + + override def toString = s"PacketTypeCodec" +} diff --git a/eclair-wire/src/main/scala/fr/acinq/eclair/wire/Test.scala b/eclair-wire/src/main/scala/fr/acinq/eclair/wire/Test.scala new file mode 100644 index 000000000..71b784f71 --- /dev/null +++ b/eclair-wire/src/main/scala/fr/acinq/eclair/wire/Test.scala @@ -0,0 +1,14 @@ +package fr.acinq.eclair.wire + +import scodec.Codec +import scodec.bits._ + +/** + * Created by PM on 17/10/2016. + */ +object Test extends App { + val bin = hex"0x00010000000000".bits + println(Codec[Packet].decode(bin)) +} + + diff --git a/pom.xml b/pom.xml index fea47abce..f956c6ba6 100644 --- a/pom.xml +++ b/pom.xml @@ -8,6 +8,7 @@ pom + eclair-wire lightning-types eclair-node @@ -160,6 +161,11 @@ + + org.scodec + scodec-core_${scala.version.short} + 1.10.2 + fr.acinq bitcoin-lib_${scala.version.short}