diff --git a/src/main/scala/io/moia/protos/teleproto/Reader.scala b/src/main/scala/io/moia/protos/teleproto/Reader.scala index e0c68e2..fc569c3 100644 --- a/src/main/scala/io/moia/protos/teleproto/Reader.scala +++ b/src/main/scala/io/moia/protos/teleproto/Reader.scala @@ -31,7 +31,7 @@ import scala.util.Try /** Provides reading of a generated Protocol Buffers model into a business model. */ @implicitNotFound("No Protocol Buffers mapper from type ${P} to ${M} was found. Try to implement an implicit Reader for this type.") -trait Reader[-P, +M] { +trait Reader[P, M] { /** Returns the read business model or an error message. */ @@ -150,6 +150,13 @@ object Reader extends LowPriorityReads { PbSuccess((Duration(protobuf.seconds, SECONDS) + Duration(protobuf.nanos.toLong, NANOSECONDS)).toCoarsest) } + /** Transforms a ScalaPB duration into a Scala concurrent duration. + */ + implicit object DurationReader extends Reader[PBDuration, Duration] { + def read(protobuf: PBDuration): PbResult[FiniteDuration] = + PbSuccess((Duration(protobuf.seconds, SECONDS) + Duration(protobuf.nanos.toLong, NANOSECONDS)).toCoarsest) + } + /** Transforms a string into a UUID. */ implicit object UUIDReader extends Reader[String, UUID] { diff --git a/src/main/scala/io/moia/protos/teleproto/VersionedModelWriter.scala b/src/main/scala/io/moia/protos/teleproto/VersionedModelWriter.scala index 6ab08d5..0f05812 100644 --- a/src/main/scala/io/moia/protos/teleproto/VersionedModelWriter.scala +++ b/src/main/scala/io/moia/protos/teleproto/VersionedModelWriter.scala @@ -125,7 +125,7 @@ object VersionedModelWriter { def writer: Writer[DetachedModel, SpecificModel] final def versioned[V](version: V): (V, Writer[DetachedModel, GeneratedMessage]) = - version -> writer + version -> writer.map[GeneratedMessage](m => m) } object CompanionWriter { diff --git a/src/main/scala/io/moia/protos/teleproto/Writer.scala b/src/main/scala/io/moia/protos/teleproto/Writer.scala index 0e904e5..53fbdff 100644 --- a/src/main/scala/io/moia/protos/teleproto/Writer.scala +++ b/src/main/scala/io/moia/protos/teleproto/Writer.scala @@ -31,7 +31,7 @@ import scala.concurrent.duration.{Deadline, Duration} @implicitNotFound( "No mapper from business model type ${M} to Protocol Buffers type ${P} was found. Try to implement an implicit Writer for this type." ) -trait Writer[-M, +P] { +trait Writer[M, P] { /** Returns the written Protocol Buffer object. */ diff --git a/src/main/scala/io/moia/protos/teleproto/WriterImpl.scala b/src/main/scala/io/moia/protos/teleproto/WriterImpl.scala index 41174f1..1066d47 100644 --- a/src/main/scala/io/moia/protos/teleproto/WriterImpl.scala +++ b/src/main/scala/io/moia/protos/teleproto/WriterImpl.scala @@ -69,7 +69,13 @@ class WriterImpl(val c: blackbox.Context) extends FormatImpl { // look for an implicit writer val writerType = appliedType(c.weakTypeTag[Writer[_, _]].tpe, modelType, protobufType) - val existingWriter = c.inferImplicitValue(writerType) + val existingWriter = + try { + c.inferImplicitValue(writerType) + } catch { + // Return EmptyTree in case of errors + case _: Throwable => EmptyTree + } // "ask" for the implicit writer or use the found one def ask: Compiled = (compileInner(q"implicitly[$writerType]"), Compatibility.full)