From e16e1106c1a184e37d83a14871d4ccc7661c2926 Mon Sep 17 00:00:00 2001 From: Dejan Mijic Date: Wed, 29 Mar 2023 01:48:17 +0200 Subject: [PATCH 01/19] Group configurations --- .../main/scala/zio/redis/RedisConfig.scala | 23 ------------------- ...{RedisClusterConfig.scala => config.scala} | 6 +++++ 2 files changed, 6 insertions(+), 23 deletions(-) delete mode 100644 redis/src/main/scala/zio/redis/RedisConfig.scala rename redis/src/main/scala/zio/redis/{RedisClusterConfig.scala => config.scala} (87%) diff --git a/redis/src/main/scala/zio/redis/RedisConfig.scala b/redis/src/main/scala/zio/redis/RedisConfig.scala deleted file mode 100644 index 01523e55c..000000000 --- a/redis/src/main/scala/zio/redis/RedisConfig.scala +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2021 John A. De Goes and the ZIO contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package zio.redis - -final case class RedisConfig(host: String, port: Int) - -object RedisConfig { - lazy val Default: RedisConfig = RedisConfig("localhost", 6379) -} diff --git a/redis/src/main/scala/zio/redis/RedisClusterConfig.scala b/redis/src/main/scala/zio/redis/config.scala similarity index 87% rename from redis/src/main/scala/zio/redis/RedisClusterConfig.scala rename to redis/src/main/scala/zio/redis/config.scala index 5504fd93d..961d4831e 100644 --- a/redis/src/main/scala/zio/redis/RedisClusterConfig.scala +++ b/redis/src/main/scala/zio/redis/config.scala @@ -18,6 +18,12 @@ package zio.redis import zio.{Chunk, Duration, durationInt} +final case class RedisConfig(host: String, port: Int) + +object RedisConfig { + lazy val Default: RedisConfig = RedisConfig("localhost", 6379) +} + final case class RedisClusterConfig(addresses: Chunk[RedisUri], retry: RetryClusterConfig = RetryClusterConfig.Default) final case class RetryClusterConfig(base: Duration, factor: Double, maxRecurs: Int) From 047e94a14e488393dedce90124ecea4701549940 Mon Sep 17 00:00:00 2001 From: Dejan Mijic Date: Wed, 29 Mar 2023 01:53:54 +0200 Subject: [PATCH 02/19] Remove codecs package --- redis/src/main/scala/zio/redis/{codecs => }/CRC16.scala | 2 +- redis/src/main/scala/zio/redis/ClusterExecutor.scala | 4 ++-- redis/src/main/scala/zio/redis/CodecSupplier.scala | 5 ++--- redis/src/main/scala/zio/redis/Input.scala | 4 ++-- redis/src/main/scala/zio/redis/RespArgument.scala | 1 - .../redis/{codecs/StringUtf8Codec.scala => Utf8Codec.scala} | 4 ++-- redis/src/test/scala/zio/redis/ApiSpec.scala | 3 +-- redis/src/test/scala/zio/redis/{codecs => }/CRC16Spec.scala | 5 ++--- redis/src/test/scala/zio/redis/ClusterExecutorSpec.scala | 3 +-- redis/src/test/scala/zio/redis/KeysSpec.scala | 2 +- .../scala/zio/redis/{codecs => }/ProtobufCodecSupplier.scala | 2 +- 11 files changed, 15 insertions(+), 20 deletions(-) rename redis/src/main/scala/zio/redis/{codecs => }/CRC16.scala (99%) rename redis/src/main/scala/zio/redis/{codecs/StringUtf8Codec.scala => Utf8Codec.scala} (97%) rename redis/src/test/scala/zio/redis/{codecs => }/CRC16Spec.scala (88%) rename redis/src/test/scala/zio/redis/{codecs => }/ProtobufCodecSupplier.scala (90%) diff --git a/redis/src/main/scala/zio/redis/codecs/CRC16.scala b/redis/src/main/scala/zio/redis/CRC16.scala similarity index 99% rename from redis/src/main/scala/zio/redis/codecs/CRC16.scala rename to redis/src/main/scala/zio/redis/CRC16.scala index c68789a40..47a6b4668 100644 --- a/redis/src/main/scala/zio/redis/codecs/CRC16.scala +++ b/redis/src/main/scala/zio/redis/CRC16.scala @@ -14,7 +14,7 @@ * limitations under the License. */ -package zio.redis.codecs +package zio.redis import zio.Chunk diff --git a/redis/src/main/scala/zio/redis/ClusterExecutor.scala b/redis/src/main/scala/zio/redis/ClusterExecutor.scala index f314cd31b..e95a80bec 100644 --- a/redis/src/main/scala/zio/redis/ClusterExecutor.scala +++ b/redis/src/main/scala/zio/redis/ClusterExecutor.scala @@ -18,11 +18,11 @@ package zio.redis import zio._ import zio.redis.ClusterExecutor._ +import zio.redis.RedisClusterConfig import zio.redis.api.Cluster.AskingCommand import zio.redis.options.Cluster._ import java.io.IOException - final case class ClusterExecutor( clusterConnectionRef: Ref.Synchronized[ClusterConnection], config: RedisClusterConfig, @@ -149,7 +149,7 @@ object ClusterExecutor { private def redis(address: RedisUri) = { val executorLayer = ZLayer.succeed(RedisConfig(address.host, address.port)) >>> RedisExecutor.layer - val codecLayer = ZLayer.succeed[CodecSupplier](CodecSupplier.utf8string) + val codecLayer = ZLayer.succeed[CodecSupplier](CodecSupplier.utf8) val redisLayer = executorLayer ++ codecLayer >>> Redis.layer for { closableScope <- Scope.make diff --git a/redis/src/main/scala/zio/redis/CodecSupplier.scala b/redis/src/main/scala/zio/redis/CodecSupplier.scala index 74f776725..e0f7703df 100644 --- a/redis/src/main/scala/zio/redis/CodecSupplier.scala +++ b/redis/src/main/scala/zio/redis/CodecSupplier.scala @@ -16,7 +16,6 @@ package zio.redis -import zio.redis.codecs.StringUtf8Codec import zio.schema.Schema import zio.schema.codec.BinaryCodec @@ -25,7 +24,7 @@ trait CodecSupplier { } object CodecSupplier { - def utf8string: CodecSupplier = new CodecSupplier { - def get[A: Schema]: BinaryCodec[A] = StringUtf8Codec.codec + def utf8: CodecSupplier = new CodecSupplier { + def get[A: Schema]: BinaryCodec[A] = Utf8Codec.codec } } diff --git a/redis/src/main/scala/zio/redis/Input.scala b/redis/src/main/scala/zio/redis/Input.scala index 4b5114680..a806aa140 100644 --- a/redis/src/main/scala/zio/redis/Input.scala +++ b/redis/src/main/scala/zio/redis/Input.scala @@ -17,11 +17,11 @@ package zio.redis import zio._ +import zio.redis.Utf8Codec import zio.schema.codec.BinaryCodec import java.time.Instant import java.util.concurrent.TimeUnit - sealed trait Input[-A] { self => @@ -57,7 +57,7 @@ object Input { } case object AuthInput extends Input[Auth] { - import zio.redis.codecs.StringUtf8Codec.codec + import Utf8Codec.codec def encode(data: Auth): RespCommand = data.username match { diff --git a/redis/src/main/scala/zio/redis/RespArgument.scala b/redis/src/main/scala/zio/redis/RespArgument.scala index e9921291c..a5fd6882b 100644 --- a/redis/src/main/scala/zio/redis/RespArgument.scala +++ b/redis/src/main/scala/zio/redis/RespArgument.scala @@ -18,7 +18,6 @@ package zio.redis import zio.Chunk import zio.redis.RespValue.BulkString -import zio.redis.codecs.CRC16 import zio.schema.codec.BinaryCodec import java.nio.charset.StandardCharsets diff --git a/redis/src/main/scala/zio/redis/codecs/StringUtf8Codec.scala b/redis/src/main/scala/zio/redis/Utf8Codec.scala similarity index 97% rename from redis/src/main/scala/zio/redis/codecs/StringUtf8Codec.scala rename to redis/src/main/scala/zio/redis/Utf8Codec.scala index ccdf03021..693384f2f 100644 --- a/redis/src/main/scala/zio/redis/codecs/StringUtf8Codec.scala +++ b/redis/src/main/scala/zio/redis/Utf8Codec.scala @@ -14,7 +14,7 @@ * limitations under the License. */ -package zio.redis.codecs +package zio.redis import zio.redis.RedisError.CodecError import zio.schema.Schema @@ -26,7 +26,7 @@ import zio.{Cause, Chunk, ZIO} import java.nio.charset.StandardCharsets -private[redis] object StringUtf8Codec { +private[redis] object Utf8Codec { implicit def codec[A](implicit schema: Schema[A]): BinaryCodec[A] = new BinaryCodec[A] { override def encode(value: A): Chunk[Byte] = diff --git a/redis/src/test/scala/zio/redis/ApiSpec.scala b/redis/src/test/scala/zio/redis/ApiSpec.scala index df2411ae9..0e3fc27b5 100644 --- a/redis/src/test/scala/zio/redis/ApiSpec.scala +++ b/redis/src/test/scala/zio/redis/ApiSpec.scala @@ -1,10 +1,9 @@ package zio.redis import zio._ -import zio.redis.codecs.ProtobufCodecSupplier +import zio.redis.{ProtobufCodecSupplier, RedisClusterConfig} import zio.test.TestAspect._ import zio.test._ - object ApiSpec extends ConnectionSpec with KeysSpec diff --git a/redis/src/test/scala/zio/redis/codecs/CRC16Spec.scala b/redis/src/test/scala/zio/redis/CRC16Spec.scala similarity index 88% rename from redis/src/test/scala/zio/redis/codecs/CRC16Spec.scala rename to redis/src/test/scala/zio/redis/CRC16Spec.scala index 9652ad891..80b539c39 100644 --- a/redis/src/test/scala/zio/redis/codecs/CRC16Spec.scala +++ b/redis/src/test/scala/zio/redis/CRC16Spec.scala @@ -1,12 +1,11 @@ -package zio.redis.codecs +package zio.redis import zio.Chunk -import zio.redis.BaseSpec +import zio.redis.{BaseSpec, CRC16} import zio.test.Assertion._ import zio.test._ import java.nio.charset.StandardCharsets - object CRC16Spec extends BaseSpec { override def spec: Spec[Environment, Any] = suite("CRC16")( diff --git a/redis/src/test/scala/zio/redis/ClusterExecutorSpec.scala b/redis/src/test/scala/zio/redis/ClusterExecutorSpec.scala index 57b70e41d..34c86338e 100644 --- a/redis/src/test/scala/zio/redis/ClusterExecutorSpec.scala +++ b/redis/src/test/scala/zio/redis/ClusterExecutorSpec.scala @@ -1,10 +1,9 @@ package zio.redis -import zio.redis.codecs.{CRC16, ProtobufCodecSupplier} import zio.redis.options.Cluster.{Slot, SlotsAmount} +import zio.redis.{CRC16, ProtobufCodecSupplier, RedisClusterConfig} import zio.test._ import zio.{Chunk, Layer, ZIO, ZLayer, durationInt} - object ClusterExecutorSpec extends BaseSpec { def spec: Spec[TestEnvironment, Any] = suite("cluster executor")( diff --git a/redis/src/test/scala/zio/redis/KeysSpec.scala b/redis/src/test/scala/zio/redis/KeysSpec.scala index 5921466a0..178fbee01 100644 --- a/redis/src/test/scala/zio/redis/KeysSpec.scala +++ b/redis/src/test/scala/zio/redis/KeysSpec.scala @@ -1,8 +1,8 @@ package zio.redis import zio._ +import zio.redis.ProtobufCodecSupplier import zio.redis.RedisError.ProtocolError -import zio.redis.codecs.ProtobufCodecSupplier import zio.test.Assertion.{exists => _, _} import zio.test.TestAspect.{restore => _, _} import zio.test._ diff --git a/redis/src/test/scala/zio/redis/codecs/ProtobufCodecSupplier.scala b/redis/src/test/scala/zio/redis/ProtobufCodecSupplier.scala similarity index 90% rename from redis/src/test/scala/zio/redis/codecs/ProtobufCodecSupplier.scala rename to redis/src/test/scala/zio/redis/ProtobufCodecSupplier.scala index bd50fd981..903287276 100644 --- a/redis/src/test/scala/zio/redis/codecs/ProtobufCodecSupplier.scala +++ b/redis/src/test/scala/zio/redis/ProtobufCodecSupplier.scala @@ -1,4 +1,4 @@ -package zio.redis.codecs +package zio.redis import zio.redis.CodecSupplier import zio.schema.Schema From 4a7d590b590526806d319fec60549172dfa71c14 Mon Sep 17 00:00:00 2001 From: Dejan Mijic Date: Wed, 29 Mar 2023 02:08:03 +0200 Subject: [PATCH 03/19] Hide internals --- .../scala/zio/redis/ClusterExecutor.scala | 3 +- redis/src/main/scala/zio/redis/Input.scala | 296 ++++++++++-------- redis/src/main/scala/zio/redis/Output.scala | 18 +- .../main/scala/zio/redis/RedisCommand.scala | 11 +- .../main/scala/zio/redis/RedisExecutor.scala | 2 +- .../main/scala/zio/redis/RespCommand.scala | 13 +- ...gument.scala => RespCommandArgument.scala} | 14 +- .../src/main/scala/zio/redis/RespValue.scala | 4 +- .../main/scala/zio/redis/ResultBuilder.scala | 5 +- .../src/test/scala/zio/redis/InputSpec.scala | 2 +- ...ec.scala => RespCommandArgumentSpec.scala} | 8 +- 11 files changed, 196 insertions(+), 180 deletions(-) rename redis/src/main/scala/zio/redis/{RespArgument.scala => RespCommandArgument.scala} (80%) rename redis/src/test/scala/zio/redis/{RespArgumentSpec.scala => RespCommandArgumentSpec.scala} (65%) diff --git a/redis/src/main/scala/zio/redis/ClusterExecutor.scala b/redis/src/main/scala/zio/redis/ClusterExecutor.scala index e95a80bec..7fa83bda2 100644 --- a/redis/src/main/scala/zio/redis/ClusterExecutor.scala +++ b/redis/src/main/scala/zio/redis/ClusterExecutor.scala @@ -23,6 +23,7 @@ import zio.redis.api.Cluster.AskingCommand import zio.redis.options.Cluster._ import java.io.IOException + final case class ClusterExecutor( clusterConnectionRef: Ref.Synchronized[ClusterConnection], config: RedisClusterConfig, @@ -56,7 +57,7 @@ final case class ClusterExecutor( } for { - keyOpt <- ZIO.succeed(command.args.collectFirst { case key: RespArgument.Key => key }) + keyOpt <- ZIO.succeed(command.args.collectFirst { case key: RespCommandArgument.Key => key }) keySlot = keyOpt.fold(Slot.Default)(key => Slot((key.asCRC16 & (SlotsAmount - 1)).toLong)) result <- executeSafe(keySlot) } yield result diff --git a/redis/src/main/scala/zio/redis/Input.scala b/redis/src/main/scala/zio/redis/Input.scala index a806aa140..7feee7d23 100644 --- a/redis/src/main/scala/zio/redis/Input.scala +++ b/redis/src/main/scala/zio/redis/Input.scala @@ -17,43 +17,42 @@ package zio.redis import zio._ -import zio.redis.Utf8Codec import zio.schema.codec.BinaryCodec import java.time.Instant import java.util.concurrent.TimeUnit -sealed trait Input[-A] { - self => - private[redis] def encode(data: A): RespCommand +private[redis] sealed trait Input[-A] { self => + def encode(data: A): RespCommand - final def contramap[B](f: B => A): Input[B] = new Input[B] { - def encode(data: B): RespCommand = self.encode(f(data)) - } + final def contramap[B](f: B => A): Input[B] = + new Input[B] { + def encode(data: B): RespCommand = self.encode(f(data)) + } } -object Input { +private[redis] object Input { def apply[A](implicit input: Input[A]): Input[A] = input case object AbsTtlInput extends Input[AbsTtl] { def encode(data: AbsTtl): RespCommand = - RespCommand(RespArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.stringify)) } case object AddressInput extends Input[Address] { def encode(data: Address): RespCommand = - RespCommand(RespArgument.Unknown(data.stringify)) + RespCommand(RespCommandArgument.Unknown(data.stringify)) } case object AggregateInput extends Input[Aggregate] { def encode(data: Aggregate): RespCommand = - RespCommand(RespArgument.Literal("AGGREGATE"), RespArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal("AGGREGATE"), RespCommandArgument.Literal(data.stringify)) } case object AlphaInput extends Input[Alpha] { def encode(data: Alpha): RespCommand = - RespCommand(RespArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.stringify)) } case object AuthInput extends Input[Auth] { @@ -61,28 +60,30 @@ object Input { def encode(data: Auth): RespCommand = data.username match { - case Some(username) => RespCommand(RespArgument.Value(username), RespArgument.Value(data.password)) - case None => RespCommand(RespArgument.Value(data.password)) + case Some(username) => + RespCommand(RespCommandArgument.Value(username), RespCommandArgument.Value(data.password)) + case None => RespCommand(RespCommandArgument.Value(data.password)) } } case object BoolInput extends Input[Boolean] { def encode(data: Boolean): RespCommand = - RespCommand(RespArgument.Literal(if (data) "1" else "0")) + RespCommand(RespCommandArgument.Literal(if (data) "1" else "0")) } case object StralgoLcsQueryTypeInput extends Input[StrAlgoLcsQueryType] { def encode(data: StrAlgoLcsQueryType): RespCommand = data match { - case StrAlgoLcsQueryType.Len => RespCommand(RespArgument.Literal("LEN")) + case StrAlgoLcsQueryType.Len => RespCommand(RespCommandArgument.Literal("LEN")) case StrAlgoLcsQueryType.Idx(minMatchLength, withMatchLength) => { - val idx = Chunk.single(RespArgument.Literal("IDX")) + val idx = Chunk.single(RespCommandArgument.Literal("IDX")) val min = if (minMatchLength > 1) - Chunk(RespArgument.Literal("MINMATCHLEN"), RespArgument.Unknown(minMatchLength.toString)) - else Chunk.empty[RespArgument] + Chunk(RespCommandArgument.Literal("MINMATCHLEN"), RespCommandArgument.Unknown(minMatchLength.toString)) + else Chunk.empty[RespCommandArgument] val length = - if (withMatchLength) Chunk.single(RespArgument.Literal("WITHMATCHLEN")) else Chunk.empty[RespArgument] + if (withMatchLength) Chunk.single(RespCommandArgument.Literal("WITHMATCHLEN")) + else Chunk.empty[RespCommandArgument] RespCommand(Chunk(idx, min, length).flatten) } } @@ -94,22 +95,27 @@ object Input { val respArgs = data match { case BitFieldGet(t, o) => - Chunk(RespArgument.Literal("GET"), RespArgument.Unknown(t.stringify), RespArgument.Unknown(o.toString)) + Chunk( + RespCommandArgument.Literal("GET"), + RespCommandArgument.Unknown(t.stringify), + RespCommandArgument.Unknown(o.toString) + ) case BitFieldSet(t, o, v) => Chunk( - RespArgument.Literal("SET"), - RespArgument.Unknown(t.stringify), - RespArgument.Unknown(o.toString), - RespArgument.Unknown(v.toString) + RespCommandArgument.Literal("SET"), + RespCommandArgument.Unknown(t.stringify), + RespCommandArgument.Unknown(o.toString), + RespCommandArgument.Unknown(v.toString) ) case BitFieldIncr(t, o, i) => Chunk( - RespArgument.Literal("INCRBY"), - RespArgument.Unknown(t.stringify), - RespArgument.Unknown(o.toString), - RespArgument.Unknown(i.toString) + RespCommandArgument.Literal("INCRBY"), + RespCommandArgument.Unknown(t.stringify), + RespCommandArgument.Unknown(o.toString), + RespCommandArgument.Unknown(i.toString) ) - case bfo: BitFieldOverflow => Chunk(RespArgument.Literal("OVERFLOW"), RespArgument.Literal(bfo.stringify)) + case bfo: BitFieldOverflow => + Chunk(RespCommandArgument.Literal("OVERFLOW"), RespCommandArgument.Literal(bfo.stringify)) } RespCommand(respArgs) } @@ -117,46 +123,47 @@ object Input { case object BitOperationInput extends Input[BitOperation] { def encode(data: BitOperation): RespCommand = - RespCommand(RespArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.stringify)) } case object BitPosRangeInput extends Input[BitPosRange] { def encode(data: BitPosRange): RespCommand = { - val start = RespArgument.Unknown(data.start.toString) - val respArgs = data.end.fold(Chunk.single(start))(end => Chunk(start, RespArgument.Unknown(end.toString))) + val start = RespCommandArgument.Unknown(data.start.toString) + val respArgs = data.end.fold(Chunk.single(start))(end => Chunk(start, RespCommandArgument.Unknown(end.toString))) RespCommand(respArgs) } } case object ByInput extends Input[String] { def encode(data: String): RespCommand = - RespCommand(RespArgument.Literal("BY"), RespArgument.Unknown(data)) + RespCommand(RespCommandArgument.Literal("BY"), RespCommandArgument.Unknown(data)) } case object ChangedInput extends Input[Changed] { def encode(data: Changed): RespCommand = - RespCommand(RespArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.stringify)) } case object ClientKillInput extends Input[ClientKillFilter] { def encode(data: ClientKillFilter): RespCommand = data match { case addr: ClientKillFilter.Address => - RespCommand(RespArgument.Literal("ADDR"), RespArgument.Unknown(addr.stringify)) + RespCommand(RespCommandArgument.Literal("ADDR"), RespCommandArgument.Unknown(addr.stringify)) case laddr: ClientKillFilter.LocalAddress => - RespCommand(RespArgument.Literal("LADDR"), RespArgument.Unknown(laddr.stringify)) + RespCommand(RespCommandArgument.Literal("LADDR"), RespCommandArgument.Unknown(laddr.stringify)) case ClientKillFilter.Id(clientId) => - RespCommand(RespArgument.Literal("ID"), RespArgument.Unknown(clientId.toString)) + RespCommand(RespCommandArgument.Literal("ID"), RespCommandArgument.Unknown(clientId.toString)) case ClientKillFilter.Type(clientType) => - RespCommand(RespArgument.Literal("TYPE"), RespArgument.Literal(clientType.stringify)) - case ClientKillFilter.User(username) => RespCommand(RespArgument.Literal("USER"), RespArgument.Unknown(username)) + RespCommand(RespCommandArgument.Literal("TYPE"), RespCommandArgument.Literal(clientType.stringify)) + case ClientKillFilter.User(username) => + RespCommand(RespCommandArgument.Literal("USER"), RespCommandArgument.Unknown(username)) case ClientKillFilter.SkipMe(skip) => - RespCommand(RespArgument.Literal("SKIPME"), RespArgument.Literal(if (skip) "YES" else "NO")) + RespCommand(RespCommandArgument.Literal("SKIPME"), RespCommandArgument.Literal(if (skip) "YES" else "NO")) } } case object ClientPauseModeInput extends Input[ClientPauseMode] { def encode(data: ClientPauseMode): RespCommand = - RespCommand(RespArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.stringify)) } case object ClientTrackingInput @@ -167,127 +174,132 @@ object Input { data match { case Some((clientRedir, mode, noLoop, prefixes)) => val modeChunk = mode match { - case Some(ClientTrackingMode.OptIn) => RespCommand(RespArgument.Literal("OPTIN")) - case Some(ClientTrackingMode.OptOut) => RespCommand(RespArgument.Literal("OPTOUT")) - case Some(ClientTrackingMode.Broadcast) => RespCommand(RespArgument.Literal("BCAST")) + case Some(ClientTrackingMode.OptIn) => RespCommand(RespCommandArgument.Literal("OPTIN")) + case Some(ClientTrackingMode.OptOut) => RespCommand(RespCommandArgument.Literal("OPTOUT")) + case Some(ClientTrackingMode.Broadcast) => RespCommand(RespCommandArgument.Literal("BCAST")) case None => RespCommand.empty } - val loopChunk = if (noLoop) RespCommand(RespArgument.Literal("NOLOOP")) else RespCommand.empty - RespCommand(RespArgument.Literal("ON")) ++ + val loopChunk = if (noLoop) RespCommand(RespCommandArgument.Literal("NOLOOP")) else RespCommand.empty + RespCommand(RespCommandArgument.Literal("ON")) ++ clientRedir.fold(RespCommand.empty)(id => - RespCommand(RespArgument.Literal("REDIRECT"), RespArgument.Unknown(id.toString)) + RespCommand(RespCommandArgument.Literal("REDIRECT"), RespCommandArgument.Unknown(id.toString)) ) ++ RespCommand( - prefixes.flatMap(prefix => Chunk(RespArgument.Literal("PREFIX"), RespArgument.Unknown(prefix))) + prefixes.flatMap(prefix => + Chunk(RespCommandArgument.Literal("PREFIX"), RespCommandArgument.Unknown(prefix)) + ) ) ++ modeChunk ++ loopChunk case None => - RespCommand(RespArgument.Literal("OFF")) + RespCommand(RespCommandArgument.Literal("OFF")) } } case object CopyInput extends Input[Copy] { def encode(data: Copy): RespCommand = - RespCommand(RespArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.stringify)) } case object CountInput extends Input[Count] { def encode(data: Count): RespCommand = - RespCommand(RespArgument.Literal("COUNT"), RespArgument.Unknown(data.count.toString)) + RespCommand(RespCommandArgument.Literal("COUNT"), RespCommandArgument.Unknown(data.count.toString)) } case object RedisTypeInput extends Input[RedisType] { def encode(data: RedisType): RespCommand = - RespCommand(RespArgument.Literal("TYPE"), RespArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal("TYPE"), RespCommandArgument.Literal(data.stringify)) } case object PatternInput extends Input[Pattern] { def encode(data: Pattern): RespCommand = - RespCommand(RespArgument.Literal("MATCH"), RespArgument.Unknown(data.pattern)) + RespCommand(RespCommandArgument.Literal("MATCH"), RespCommandArgument.Unknown(data.pattern)) } case object GetInput extends Input[String] { def encode(data: String): RespCommand = - RespCommand(RespArgument.Literal("GET"), RespArgument.Unknown(data)) + RespCommand(RespCommandArgument.Literal("GET"), RespCommandArgument.Unknown(data)) } case object PositionInput extends Input[Position] { def encode(data: Position): RespCommand = - RespCommand(RespArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.stringify)) } case object SideInput extends Input[Side] { def encode(data: Side): RespCommand = - RespCommand(RespArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.stringify)) } case object DoubleInput extends Input[Double] { def encode(data: Double): RespCommand = - RespCommand(RespArgument.Unknown(data.toString)) + RespCommand(RespCommandArgument.Unknown(data.toString)) } case object DurationMillisecondsInput extends Input[Duration] { def encode(data: Duration): RespCommand = - RespCommand(RespArgument.Unknown(data.toMillis.toString)) + RespCommand(RespCommandArgument.Unknown(data.toMillis.toString)) } case object DurationSecondsInput extends Input[Duration] { def encode(data: Duration): RespCommand = { val seconds = TimeUnit.MILLISECONDS.toSeconds(data.toMillis) - RespCommand(RespArgument.Unknown(seconds.toString)) + RespCommand(RespCommandArgument.Unknown(seconds.toString)) } } case object DurationTtlInput extends Input[Duration] { def encode(data: Duration): RespCommand = { val milliseconds = data.toMillis - RespCommand(RespArgument.Literal("PX"), RespArgument.Unknown(milliseconds.toString)) + RespCommand(RespCommandArgument.Literal("PX"), RespCommandArgument.Unknown(milliseconds.toString)) } } case object FreqInput extends Input[Freq] { def encode(data: Freq): RespCommand = - RespCommand(RespArgument.Literal("FREQ"), RespArgument.Unknown(data.frequency)) + RespCommand(RespCommandArgument.Literal("FREQ"), RespCommandArgument.Unknown(data.frequency)) } case object IdleTimeInput extends Input[IdleTime] { def encode(data: IdleTime): RespCommand = - RespCommand(RespArgument.Literal("IDLETIME"), RespArgument.Unknown(data.seconds.toString)) + RespCommand(RespCommandArgument.Literal("IDLETIME"), RespCommandArgument.Unknown(data.seconds.toString)) } case object IncrementInput extends Input[Increment] { def encode(data: Increment): RespCommand = - RespCommand(RespArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.stringify)) } case object KeepTtlInput extends Input[KeepTtl] { def encode(data: KeepTtl): RespCommand = - RespCommand(RespArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.stringify)) } case object LimitInput extends Input[Limit] { def encode(data: Limit): RespCommand = RespCommand( - RespArgument.Literal("LIMIT"), - RespArgument.Unknown(data.offset.toString), - RespArgument.Unknown(data.count.toString) + RespCommandArgument.Literal("LIMIT"), + RespCommandArgument.Unknown(data.offset.toString), + RespCommandArgument.Unknown(data.count.toString) ) } case object LongInput extends Input[Long] { def encode(data: Long): RespCommand = - RespCommand(RespArgument.Unknown(data.toString)) + RespCommand(RespCommandArgument.Unknown(data.toString)) } case object LongLatInput extends Input[LongLat] { def encode(data: LongLat): RespCommand = - RespCommand(RespArgument.Unknown(data.longitude.toString), RespArgument.Unknown(data.latitude.toString)) + RespCommand( + RespCommandArgument.Unknown(data.longitude.toString), + RespCommandArgument.Unknown(data.latitude.toString) + ) } final case class MemberScoreInput[M: BinaryCodec]() extends Input[MemberScore[M]] { def encode(data: MemberScore[M]): RespCommand = - RespCommand(RespArgument.Unknown(data.score.toString), RespArgument.Value(data.member)) + RespCommand(RespCommandArgument.Unknown(data.score.toString), RespCommandArgument.Value(data.member)) } case object NoInput extends Input[Unit] { @@ -301,57 +313,57 @@ object Input { case object OrderInput extends Input[Order] { def encode(data: Order): RespCommand = - RespCommand(RespArgument.Unknown(data.stringify)) + RespCommand(RespCommandArgument.Unknown(data.stringify)) } case object RadiusUnitInput extends Input[RadiusUnit] { def encode(data: RadiusUnit): RespCommand = - RespCommand(RespArgument.Unknown(data.stringify)) + RespCommand(RespCommandArgument.Unknown(data.stringify)) } case object RangeInput extends Input[Range] { def encode(data: Range): RespCommand = - RespCommand(RespArgument.Unknown(data.start.toString), RespArgument.Unknown(data.end.toString)) + RespCommand(RespCommandArgument.Unknown(data.start.toString), RespCommandArgument.Unknown(data.end.toString)) } case object ReplaceInput extends Input[Replace] { def encode(data: Replace): RespCommand = - RespCommand(RespArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.stringify)) } case object StoreDistInput extends Input[StoreDist] { def encode(data: StoreDist): RespCommand = - RespCommand(RespArgument.Literal("STOREDIST"), RespArgument.Unknown(data.key)) + RespCommand(RespCommandArgument.Literal("STOREDIST"), RespCommandArgument.Unknown(data.key)) } case object StoreInput extends Input[Store] { def encode(data: Store): RespCommand = - RespCommand(RespArgument.Literal("STORE"), RespArgument.Unknown(data.key)) + RespCommand(RespCommandArgument.Literal("STORE"), RespCommandArgument.Unknown(data.key)) } case object StringInput extends Input[String] { def encode(data: String): RespCommand = - RespCommand(RespArgument.Unknown(data)) + RespCommand(RespCommandArgument.Unknown(data)) } case object CommandNameInput extends Input[String] { def encode(data: String): RespCommand = - RespCommand(RespArgument.CommandName(data)) + RespCommand(RespCommandArgument.CommandName(data)) } final case class ArbitraryValueInput[A: BinaryCodec]() extends Input[A] { def encode(data: A): RespCommand = - RespCommand(RespArgument.Value(data)) + RespCommand(RespCommandArgument.Value(data)) } final case class ArbitraryKeyInput[A: BinaryCodec]() extends Input[A] { def encode(data: A): RespCommand = - RespCommand(RespArgument.Key(data)) + RespCommand(RespCommandArgument.Key(data)) } case object ValueInput extends Input[Chunk[Byte]] { def encode(data: Chunk[Byte]): RespCommand = - RespCommand(RespArgument.Value(data)) + RespCommand(RespCommandArgument.Value(data)) } final case class OptionalInput[-A](a: Input[A]) extends Input[Option[A]] { @@ -361,18 +373,18 @@ object Input { case object TimeSecondsInput extends Input[Instant] { def encode(data: Instant): RespCommand = - RespCommand(RespArgument.Unknown(data.getEpochSecond.toString)) + RespCommand(RespCommandArgument.Unknown(data.getEpochSecond.toString)) } case object TimeMillisecondsInput extends Input[Instant] { def encode(data: Instant): RespCommand = - RespCommand(RespArgument.Unknown(data.toEpochMilli.toString)) + RespCommand(RespCommandArgument.Unknown(data.toEpochMilli.toString)) } case object WeightsInput extends Input[::[Double]] { def encode(data: ::[Double]): RespCommand = { - val args = data.foldLeft(Chunk.single[RespArgument](RespArgument.Literal("WEIGHTS"))) { (acc, a) => - acc ++ Chunk.single(RespArgument.Unknown(a.toString)) + val args = data.foldLeft(Chunk.single[RespCommandArgument](RespCommandArgument.Literal("WEIGHTS"))) { (acc, a) => + acc ++ Chunk.single(RespCommandArgument.Unknown(a.toString)) } RespCommand(args) } @@ -380,30 +392,30 @@ object Input { case object IdleInput extends Input[Duration] { def encode(data: Duration): RespCommand = - RespCommand(RespArgument.Literal("IDLE"), RespArgument.Unknown(data.toMillis.toString)) + RespCommand(RespCommandArgument.Literal("IDLE"), RespCommandArgument.Unknown(data.toMillis.toString)) } case object TimeInput extends Input[Duration] { def encode(data: Duration): RespCommand = - RespCommand(RespArgument.Literal("TIME"), RespArgument.Unknown(data.toMillis.toString)) + RespCommand(RespCommandArgument.Literal("TIME"), RespCommandArgument.Unknown(data.toMillis.toString)) } case object RetryCountInput extends Input[Long] { def encode(data: Long): RespCommand = - RespCommand(RespArgument.Literal("RETRYCOUNT"), RespArgument.Unknown(data.toString)) + RespCommand(RespCommandArgument.Literal("RETRYCOUNT"), RespCommandArgument.Unknown(data.toString)) } final case class XGroupCreateInput[K: BinaryCodec, G: BinaryCodec, I: BinaryCodec]() extends Input[XGroupCommand.Create[K, G, I]] { def encode(data: XGroupCommand.Create[K, G, I]): RespCommand = { val chunk = Chunk( - RespArgument.Literal("CREATE"), - RespArgument.Key(data.key), - RespArgument.Unknown(data.group), - RespArgument.Unknown(data.id) + RespCommandArgument.Literal("CREATE"), + RespCommandArgument.Key(data.key), + RespCommandArgument.Unknown(data.group), + RespCommandArgument.Unknown(data.id) ) - RespCommand(if (data.mkStream) chunk :+ RespArgument.Literal(MkStream.stringify) else chunk) + RespCommand(if (data.mkStream) chunk :+ RespCommandArgument.Literal(MkStream.stringify) else chunk) } } @@ -411,26 +423,30 @@ object Input { extends Input[XGroupCommand.SetId[K, G, I]] { def encode(data: XGroupCommand.SetId[K, G, I]): RespCommand = RespCommand( - RespArgument.Literal("SETID"), - RespArgument.Key(data.key), - RespArgument.Unknown(data.group), - RespArgument.Unknown(data.id) + RespCommandArgument.Literal("SETID"), + RespCommandArgument.Key(data.key), + RespCommandArgument.Unknown(data.group), + RespCommandArgument.Unknown(data.id) ) } final case class XGroupDestroyInput[K: BinaryCodec, G: BinaryCodec]() extends Input[XGroupCommand.Destroy[K, G]] { def encode(data: XGroupCommand.Destroy[K, G]): RespCommand = - RespCommand(RespArgument.Literal("DESTROY"), RespArgument.Key(data.key), RespArgument.Unknown(data.group)) + RespCommand( + RespCommandArgument.Literal("DESTROY"), + RespCommandArgument.Key(data.key), + RespCommandArgument.Unknown(data.group) + ) } final case class XGroupCreateConsumerInput[K: BinaryCodec, G: BinaryCodec, C: BinaryCodec]() extends Input[XGroupCommand.CreateConsumer[K, G, C]] { def encode(data: XGroupCommand.CreateConsumer[K, G, C]): RespCommand = RespCommand( - RespArgument.Literal("CREATECONSUMER"), - RespArgument.Key(data.key), - RespArgument.Unknown(data.group), - RespArgument.Unknown(data.consumer) + RespCommandArgument.Literal("CREATECONSUMER"), + RespCommandArgument.Key(data.key), + RespCommandArgument.Unknown(data.group), + RespCommandArgument.Unknown(data.consumer) ) } @@ -438,51 +454,51 @@ object Input { extends Input[XGroupCommand.DelConsumer[K, G, C]] { def encode(data: XGroupCommand.DelConsumer[K, G, C]): RespCommand = RespCommand( - RespArgument.Literal("DELCONSUMER"), - RespArgument.Key(data.key), - RespArgument.Unknown(data.group), - RespArgument.Unknown(data.consumer) + RespCommandArgument.Literal("DELCONSUMER"), + RespCommandArgument.Key(data.key), + RespCommandArgument.Unknown(data.group), + RespCommandArgument.Unknown(data.consumer) ) } case object BlockInput extends Input[Duration] { def encode(data: Duration): RespCommand = - RespCommand(RespArgument.Literal("BLOCK"), RespArgument.Unknown(data.toMillis.toString)) + RespCommand(RespCommandArgument.Literal("BLOCK"), RespCommandArgument.Unknown(data.toMillis.toString)) } final case class StreamsInput[K: BinaryCodec, V: BinaryCodec]() extends Input[((K, V), Chunk[(K, V)])] { def encode(data: ((K, V), Chunk[(K, V)])): RespCommand = { val (keys, ids) = (data._1 +: data._2).map { case (key, value) => - (RespArgument.Key(key), RespArgument.Value(value)) + (RespCommandArgument.Key(key), RespCommandArgument.Value(value)) }.unzip - RespCommand(Chunk.single(RespArgument.Literal("STREAMS")) ++ keys ++ ids) + RespCommand(Chunk.single(RespCommandArgument.Literal("STREAMS")) ++ keys ++ ids) } } case object NoAckInput extends Input[NoAck] { def encode(data: NoAck): RespCommand = - RespCommand(RespArgument.Unknown(data.stringify)) + RespCommand(RespCommandArgument.Unknown(data.stringify)) } case object StreamMaxLenInput extends Input[StreamMaxLen] { def encode(data: StreamMaxLen): RespCommand = { val chunk = - if (data.approximate) Chunk(RespArgument.Literal("MAXLEN"), RespArgument.Literal("~")) - else Chunk.single(RespArgument.Literal("MAXLEN")) + if (data.approximate) Chunk(RespCommandArgument.Literal("MAXLEN"), RespCommandArgument.Literal("~")) + else Chunk.single(RespCommandArgument.Literal("MAXLEN")) - RespCommand(chunk :+ RespArgument.Unknown(data.count.toString)) + RespCommand(chunk :+ RespCommandArgument.Unknown(data.count.toString)) } } case object ListMaxLenInput extends Input[ListMaxLen] { def encode(data: ListMaxLen): RespCommand = - RespCommand(RespArgument.Literal("MAXLEN"), RespArgument.Unknown(data.count.toString)) + RespCommand(RespCommandArgument.Literal("MAXLEN"), RespCommandArgument.Unknown(data.count.toString)) } case object RankInput extends Input[Rank] { def encode(data: Rank): RespCommand = - RespCommand(RespArgument.Literal("RANK"), RespArgument.Unknown(data.rank.toString)) + RespCommand(RespCommandArgument.Literal("RANK"), RespCommandArgument.Unknown(data.rank.toString)) } final case class Tuple2[-A, -B](_1: Input[A], _2: Input[B]) extends Input[(A, B)] { @@ -589,14 +605,14 @@ object Input { case object UpdateInput extends Input[Update] { def encode(data: Update): RespCommand = - RespCommand(RespArgument.Unknown(data.stringify)) + RespCommand(RespCommandArgument.Unknown(data.stringify)) } final case class GetExPersistInput[K: BinaryCodec]() extends Input[(K, Boolean)] { def encode(data: (K, Boolean)): RespCommand = RespCommand( - if (data._2) Chunk(RespArgument.Key(data._1), RespArgument.Literal("PERSIST")) - else Chunk(RespArgument.Key(data._1)) + if (data._2) Chunk(RespCommandArgument.Key(data._1), RespCommandArgument.Literal("PERSIST")) + else Chunk(RespCommandArgument.Key(data._1)) ) } @@ -604,9 +620,12 @@ object Input { def encode(data: (K, Expire, Duration)): RespCommand = data match { case (key, Expire.SetExpireSeconds, duration) => - RespCommand(RespArgument.Key(key), RespArgument.Literal("EX")) ++ DurationSecondsInput.encode(duration) + RespCommand(RespCommandArgument.Key(key), RespCommandArgument.Literal("EX")) ++ DurationSecondsInput.encode( + duration + ) case (key, Expire.SetExpireMilliseconds, duration) => - RespCommand(RespArgument.Key(key), RespArgument.Literal("PX")) ++ DurationMillisecondsInput.encode(duration) + RespCommand(RespCommandArgument.Key(key), RespCommandArgument.Literal("PX")) ++ DurationMillisecondsInput + .encode(duration) } } @@ -614,20 +633,23 @@ object Input { def encode(data: (K, ExpiredAt, Instant)): RespCommand = data match { case (key, ExpiredAt.SetExpireAtSeconds, instant) => - RespCommand(RespArgument.Key(key), RespArgument.Literal("EXAT")) ++ TimeSecondsInput.encode(instant) + RespCommand(RespCommandArgument.Key(key), RespCommandArgument.Literal("EXAT")) ++ TimeSecondsInput.encode( + instant + ) case (key, ExpiredAt.SetExpireAtMilliseconds, instant) => - RespCommand(RespArgument.Key(key), RespArgument.Literal("PXAT")) ++ TimeMillisecondsInput.encode(instant) + RespCommand(RespCommandArgument.Key(key), RespCommandArgument.Literal("PXAT")) ++ TimeMillisecondsInput + .encode(instant) } } case object IdInput extends Input[Long] { def encode(data: Long): RespCommand = - RespCommand(RespArgument.Literal("ID"), RespArgument.Unknown(data.toString)) + RespCommand(RespCommandArgument.Literal("ID"), RespCommandArgument.Unknown(data.toString)) } case object UnblockBehaviorInput extends Input[UnblockBehavior] { def encode(data: UnblockBehavior): RespCommand = - RespCommand(RespArgument.Unknown(data.stringify)) + RespCommand(RespCommandArgument.Unknown(data.stringify)) } final case class Varargs[-A](input: Input[A]) extends Input[Iterable[A]] { @@ -638,12 +660,12 @@ object Input { final case class EvalInput[-K, -V](inputK: Input[K], inputV: Input[V]) extends Input[(String, Chunk[K], Chunk[V])] { def encode(data: (String, Chunk[K], Chunk[V])): RespCommand = { val (lua, keys, args) = data - val encodedScript = RespCommand(RespArgument.Unknown(lua), RespArgument.Unknown(keys.size.toString)) + val encodedScript = RespCommand(RespCommandArgument.Unknown(lua), RespCommandArgument.Unknown(keys.size.toString)) val encodedKeys = keys.foldLeft(RespCommand.empty)((acc, a) => - acc ++ inputK.encode(a).mapArguments(arg => RespArgument.Key(arg.value.value)) + acc ++ inputK.encode(a).mapArguments(arg => RespCommandArgument.Key(arg.value.value)) ) val encodedArgs = args.foldLeft(RespCommand.empty)((acc, a) => - acc ++ inputV.encode(a).mapArguments(arg => RespArgument.Value(arg.value.value)) + acc ++ inputV.encode(a).mapArguments(arg => RespCommandArgument.Value(arg.value.value)) ) encodedScript ++ encodedKeys ++ encodedArgs } @@ -651,46 +673,46 @@ object Input { case object ScriptDebugInput extends Input[DebugMode] { def encode(data: DebugMode): RespCommand = - RespCommand(RespArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.stringify)) } case object ScriptFlushInput extends Input[FlushMode] { def encode(data: FlushMode): RespCommand = - RespCommand(RespArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.stringify)) } case object WithScoresInput extends Input[WithScores] { def encode(data: WithScores): RespCommand = - RespCommand(RespArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.stringify)) } case object WithCoordInput extends Input[WithCoord] { def encode(data: WithCoord): RespCommand = - RespCommand(RespArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.stringify)) } case object WithDistInput extends Input[WithDist] { def encode(data: WithDist): RespCommand = - RespCommand(RespArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.stringify)) } case object WithHashInput extends Input[WithHash] { def encode(data: WithHash): RespCommand = - RespCommand(RespArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.stringify)) } case object WithForceInput extends Input[WithForce] { def encode(data: WithForce): RespCommand = - RespCommand(RespArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.stringify)) } case object WithJustIdInput extends Input[WithJustId] { def encode(data: WithJustId): RespCommand = - RespCommand(RespArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.stringify)) } case object YesNoInput extends Input[Boolean] { def encode(data: Boolean): RespCommand = - RespCommand(RespArgument.Literal(if (data) "YES" else "NO")) + RespCommand(RespCommandArgument.Literal(if (data) "YES" else "NO")) } } diff --git a/redis/src/main/scala/zio/redis/Output.scala b/redis/src/main/scala/zio/redis/Output.scala index c80d07da7..c779202b8 100644 --- a/redis/src/main/scala/zio/redis/Output.scala +++ b/redis/src/main/scala/zio/redis/Output.scala @@ -21,15 +21,7 @@ import zio.redis.options.Cluster.{Node, Partition, SlotRange} import zio.schema.Schema import zio.schema.codec.BinaryCodec -sealed trait Output[+A] { - self => - - private[redis] final def unsafeDecode(respValue: RespValue): A = - respValue match { - case error: RespValue.Error => throw error.toRedisError - case success => tryDecode(success) - } - +private[redis] sealed trait Output[+A] { self => protected def tryDecode(respValue: RespValue): A final def map[B](f: A => B): Output[B] = @@ -37,10 +29,14 @@ sealed trait Output[+A] { protected def tryDecode(respValue: RespValue): B = f(self.tryDecode(respValue)) } + final def unsafeDecode(respValue: RespValue): A = + respValue match { + case error: RespValue.Error => throw error.toRedisError + case success => tryDecode(success) + } } -object Output { - +private[redis] object Output { import RedisError._ def apply[A](implicit output: Output[A]): Output[A] = output diff --git a/redis/src/main/scala/zio/redis/RedisCommand.scala b/redis/src/main/scala/zio/redis/RedisCommand.scala index 0bfbf93e6..bc28804ff 100644 --- a/redis/src/main/scala/zio/redis/RedisCommand.scala +++ b/redis/src/main/scala/zio/redis/RedisCommand.scala @@ -19,25 +19,24 @@ package zio.redis import zio._ import zio.redis.Input.{CommandNameInput, Varargs} -final class RedisCommand[-In, +Out] private ( +private[redis] final class RedisCommand[-In, +Out] private ( val name: String, val input: Input[In], val output: Output[Out], val executor: RedisExecutor ) { - - private[redis] def run(in: In): IO[RedisError, Out] = + def run(in: In): IO[RedisError, Out] = executor .execute(resp(in)) .flatMap[Any, Throwable, Out](out => ZIO.attempt(output.unsafeDecode(out))) .refineToOrDie[RedisError] - private[redis] def resp(in: In): RespCommand = + def resp(in: In): RespCommand = Varargs(CommandNameInput).encode(name.split(" ")) ++ input.encode(in) } -object RedisCommand { - private[redis] def apply[In, Out]( +private[redis] object RedisCommand { + def apply[In, Out]( name: String, input: Input[In], output: Output[Out], diff --git a/redis/src/main/scala/zio/redis/RedisExecutor.scala b/redis/src/main/scala/zio/redis/RedisExecutor.scala index 7e041c00c..112e08e62 100644 --- a/redis/src/main/scala/zio/redis/RedisExecutor.scala +++ b/redis/src/main/scala/zio/redis/RedisExecutor.scala @@ -19,7 +19,7 @@ package zio.redis import zio.{IO, ZLayer} trait RedisExecutor { - def execute(command: RespCommand): IO[RedisError, RespValue] + private[redis] def execute(command: RespCommand): IO[RedisError, RespValue] } object RedisExecutor { diff --git a/redis/src/main/scala/zio/redis/RespCommand.scala b/redis/src/main/scala/zio/redis/RespCommand.scala index 94bd8d5ee..daaa121af 100644 --- a/redis/src/main/scala/zio/redis/RespCommand.scala +++ b/redis/src/main/scala/zio/redis/RespCommand.scala @@ -18,19 +18,18 @@ package zio.redis import zio.Chunk -final case class RespCommand(args: Chunk[RespArgument]) { +private[redis] final case class RespCommand(args: Chunk[RespCommandArgument]) extends AnyVal { def ++(that: RespCommand): RespCommand = RespCommand(this.args ++ that.args) - def mapArguments(f: RespArgument => RespArgument): RespCommand = RespCommand(args.map(f(_))) + def mapArguments(f: RespCommandArgument => RespCommandArgument): RespCommand = RespCommand(args.map(f(_))) } -object RespCommand { - +private[redis] object RespCommand { def empty: RespCommand = new RespCommand(Chunk.empty) - def apply(args: Chunk[RespArgument]): RespCommand = new RespCommand(args) + def apply(args: Chunk[RespCommandArgument]): RespCommand = new RespCommand(args) - def apply(args: RespArgument*): RespCommand = new RespCommand(Chunk.fromIterable(args)) + def apply(args: RespCommandArgument*): RespCommand = new RespCommand(Chunk.fromIterable(args)) - def apply(arg: RespArgument): RespCommand = new RespCommand(Chunk.single(arg)) + def apply(arg: RespCommandArgument): RespCommand = new RespCommand(Chunk.single(arg)) } diff --git a/redis/src/main/scala/zio/redis/RespArgument.scala b/redis/src/main/scala/zio/redis/RespCommandArgument.scala similarity index 80% rename from redis/src/main/scala/zio/redis/RespArgument.scala rename to redis/src/main/scala/zio/redis/RespCommandArgument.scala index a5fd6882b..feec263d0 100644 --- a/redis/src/main/scala/zio/redis/RespArgument.scala +++ b/redis/src/main/scala/zio/redis/RespCommandArgument.scala @@ -22,13 +22,13 @@ import zio.schema.codec.BinaryCodec import java.nio.charset.StandardCharsets -sealed trait RespArgument { +private[redis] sealed trait RespCommandArgument { def value: RespValue.BulkString } -object RespArgument { +private[redis] object RespCommandArgument { - final case class Unknown(bytes: Chunk[Byte]) extends RespArgument { + final case class Unknown(bytes: Chunk[Byte]) extends RespCommandArgument { lazy val value: BulkString = RespValue.BulkString(bytes) } @@ -37,15 +37,15 @@ object RespArgument { def apply[A](data: A)(implicit codec: BinaryCodec[A]): Unknown = Unknown(codec.encode(data)) } - final case class CommandName(str: String) extends RespArgument { + final case class CommandName(str: String) extends RespCommandArgument { lazy val value: BulkString = RespValue.bulkString(str) } - final case class Literal(str: String) extends RespArgument { + final case class Literal(str: String) extends RespCommandArgument { lazy val value: BulkString = RespValue.bulkString(str) } - final case class Key(bytes: Chunk[Byte]) extends RespArgument { + final case class Key(bytes: Chunk[Byte]) extends RespCommandArgument { lazy val value: BulkString = RespValue.BulkString(bytes) lazy val asCRC16: Int = { @@ -59,7 +59,7 @@ object RespArgument { def apply[A](data: A)(implicit codec: BinaryCodec[A]): Key = Key(codec.encode(data)) } - final case class Value(bytes: Chunk[Byte]) extends RespArgument { + final case class Value(bytes: Chunk[Byte]) extends RespCommandArgument { lazy val value: BulkString = RespValue.BulkString(bytes) } diff --git a/redis/src/main/scala/zio/redis/RespValue.scala b/redis/src/main/scala/zio/redis/RespValue.scala index e19317f19..64e43cc12 100644 --- a/redis/src/main/scala/zio/redis/RespValue.scala +++ b/redis/src/main/scala/zio/redis/RespValue.scala @@ -22,7 +22,7 @@ import zio.stream._ import java.nio.charset.StandardCharsets -sealed trait RespValue extends Product with Serializable { self => +private[redis] sealed trait RespValue extends Product with Serializable { self => import RespValue._ import RespValue.internal.{CrLf, Headers, NullArrayEncoded, NullStringEncoded} @@ -46,7 +46,7 @@ sealed trait RespValue extends Product with Serializable { self => Chunk.fromArray(s.getBytes(StandardCharsets.US_ASCII)) ++ CrLf } -object RespValue { +private[redis] object RespValue { final case class SimpleString(value: String) extends RespValue final case class Error(value: String) extends RespValue { diff --git a/redis/src/main/scala/zio/redis/ResultBuilder.scala b/redis/src/main/scala/zio/redis/ResultBuilder.scala index 7f89f91e0..fa629d2e8 100644 --- a/redis/src/main/scala/zio/redis/ResultBuilder.scala +++ b/redis/src/main/scala/zio/redis/ResultBuilder.scala @@ -20,14 +20,13 @@ import zio.IO import zio.redis.ResultBuilder.NeedsReturnType import zio.schema.Schema -sealed trait ResultBuilder { +private[redis] sealed trait ResultBuilder { final def map(f: Nothing => Any)(implicit nrt: NeedsReturnType): IO[Nothing, Nothing] = ??? final def flatMap(f: Nothing => Any)(implicit nrt: NeedsReturnType): IO[Nothing, Nothing] = ??? } -object ResultBuilder { - +private[redis] object ResultBuilder { @annotation.implicitNotFound("Use `returning[A]` to specify method's return type") final abstract class NeedsReturnType diff --git a/redis/src/test/scala/zio/redis/InputSpec.scala b/redis/src/test/scala/zio/redis/InputSpec.scala index da9154b5f..00e44c670 100644 --- a/redis/src/test/scala/zio/redis/InputSpec.scala +++ b/redis/src/test/scala/zio/redis/InputSpec.scala @@ -2,7 +2,7 @@ package zio.redis import zio._ import zio.redis.Input._ -import zio.redis.RespArgument._ +import zio.redis.RespCommandArgument._ import zio.test.Assertion._ import zio.test._ diff --git a/redis/src/test/scala/zio/redis/RespArgumentSpec.scala b/redis/src/test/scala/zio/redis/RespCommandArgumentSpec.scala similarity index 65% rename from redis/src/test/scala/zio/redis/RespArgumentSpec.scala rename to redis/src/test/scala/zio/redis/RespCommandArgumentSpec.scala index 670cf8e81..5130804a8 100644 --- a/redis/src/test/scala/zio/redis/RespArgumentSpec.scala +++ b/redis/src/test/scala/zio/redis/RespCommandArgumentSpec.scala @@ -2,20 +2,20 @@ package zio.redis import zio.test._ -object RespArgumentSpec extends BaseSpec { +object RespCommandArgumentSpec extends BaseSpec { def spec: Spec[Any, RedisError.ProtocolError] = suite("RespArgument")( suite("BulkString.asCRC16")( test("key without braces") { - val key = RespArgument.Key("hello world") + val key = RespCommandArgument.Key("hello world") assertTrue(15332 == key.asCRC16) }, test("key between braces") { - val key = RespArgument.Key("hello{key1}wor}ld") + val key = RespCommandArgument.Key("hello{key1}wor}ld") assertTrue(41957 == key.asCRC16) }, test("empty key between braces") { - val key = RespArgument.Key("hello{}world") + val key = RespCommandArgument.Key("hello{}world") assertTrue(40253 == key.asCRC16) } ) From 72e05b7baea2ee4cc943f9af3384b722dd573aef Mon Sep 17 00:00:00 2001 From: Dejan Mijic Date: Wed, 29 Mar 2023 02:26:30 +0200 Subject: [PATCH 04/19] Align layers usage --- .../redis/benchmarks/BenchmarkRuntime.scala | 2 +- docs/index.md | 7 +++---- .../zio/redis/embedded/EmbeddedRedis.scala | 19 ++++++++++--------- .../redis/embedded/EmbeddedRedisSpec.scala | 4 ++-- example/src/main/scala/example/Main.scala | 4 ++-- .../scala/zio/redis/ClusterExecutor.scala | 2 +- .../scala/zio/redis/RedisConnectionLive.scala | 4 ++-- .../main/scala/zio/redis/RedisExecutor.scala | 10 +--------- .../main/scala/zio/redis/ResultBuilder.scala | 1 + .../scala/zio/redis/SingleNodeExecutor.scala | 13 ++++++------- redis/src/main/scala/zio/redis/config.scala | 2 +- redis/src/test/scala/zio/redis/ApiSpec.scala | 2 +- .../scala/zio/redis/ClusterExecutorSpec.scala | 2 +- redis/src/test/scala/zio/redis/KeysSpec.scala | 1 - .../zio/redis/RedisConnectionLiveSpec.scala | 2 +- 15 files changed, 33 insertions(+), 42 deletions(-) diff --git a/benchmarks/src/main/scala/zio/redis/benchmarks/BenchmarkRuntime.scala b/benchmarks/src/main/scala/zio/redis/benchmarks/BenchmarkRuntime.scala index 9cf67ad84..30280827f 100644 --- a/benchmarks/src/main/scala/zio/redis/benchmarks/BenchmarkRuntime.scala +++ b/benchmarks/src/main/scala/zio/redis/benchmarks/BenchmarkRuntime.scala @@ -35,7 +35,7 @@ trait BenchmarkRuntime { object BenchmarkRuntime { private final val Layer = ZLayer.make[Redis]( - RedisExecutor.local, + SingleNodeExecutor.local, ZLayer.succeed[CodecSupplier](new CodecSupplier { def get[A: Schema]: BinaryCodec[A] = ProtobufCodec.protobufCodec }), diff --git a/docs/index.md b/docs/index.md index d7cde6856..6e7c3ef97 100644 --- a/docs/index.md +++ b/docs/index.md @@ -61,8 +61,7 @@ object ZIORedisExample extends ZIOAppDefault { override def run = myApp.provide( Redis.layer, - RedisExecutor.layer, - ZLayer.succeed(RedisConfig.Default), + SingleNodeExecutor.local, ZLayer.succeed[CodecSupplier](ProtobufCodecSupplier) ) } @@ -108,8 +107,8 @@ object EmbeddedRedisSpec extends ZIOSpecDefault { } yield assert(found)(isSome(equalTo(item))) } ).provideShared( - EmbeddedRedis.layer.orDie, - RedisExecutor.layer.orDie, + EmbeddedRedis.layer, + SingleNodeExecutor.layer, ZLayer.succeed[CodecSupplier](ProtobufCodecSupplier), Redis.layer ) @@ TestAspect.silentLogging diff --git a/embedded/src/main/scala/zio/redis/embedded/EmbeddedRedis.scala b/embedded/src/main/scala/zio/redis/embedded/EmbeddedRedis.scala index e749460bd..13d4fa542 100644 --- a/embedded/src/main/scala/zio/redis/embedded/EmbeddedRedis.scala +++ b/embedded/src/main/scala/zio/redis/embedded/EmbeddedRedis.scala @@ -34,14 +34,15 @@ object EmbeddedRedis { findFreePort } - val layer: ZLayer[Any, Throwable, RedisConfig] = ZLayer.scoped( - for { - port <- findFreePort - redisServer <- ZIO.acquireRelease(ZIO.attemptBlockingIO(new RedisServer(port)))(redisServer => - ZIO.attemptBlockingIO(redisServer.stop).ignoreLogged - ) - _ <- ZIO.attemptBlockingIO(redisServer.start) - } yield RedisConfig("localhost", port) - ) + lazy val layer: ZLayer[Any, Throwable, RedisConfig] = + ZLayer.scoped { + for { + port <- findFreePort + redisServer <- ZIO.acquireRelease(ZIO.attemptBlockingIO(new RedisServer(port)))(redisServer => + ZIO.attemptBlockingIO(redisServer.stop).ignoreLogged + ) + _ <- ZIO.attemptBlockingIO(redisServer.start) + } yield RedisConfig("localhost", port) + } } diff --git a/embedded/src/test/scala/zio/redis/embedded/EmbeddedRedisSpec.scala b/embedded/src/test/scala/zio/redis/embedded/EmbeddedRedisSpec.scala index bd6928fc0..d484f805d 100644 --- a/embedded/src/test/scala/zio/redis/embedded/EmbeddedRedisSpec.scala +++ b/embedded/src/test/scala/zio/redis/embedded/EmbeddedRedisSpec.scala @@ -42,8 +42,8 @@ object EmbeddedRedisSpec extends ZIOSpecDefault { } yield assert(found)(isSome(equalTo(item))) } ).provideShared( - EmbeddedRedis.layer.orDie, - RedisExecutor.layer.orDie, + EmbeddedRedis.layer, + SingleNodeExecutor.layer, ZLayer.succeed[CodecSupplier](new CodecSupplier { def get[A: Schema]: BinaryCodec[A] = ProtobufCodec.protobufCodec }), diff --git a/example/src/main/scala/example/Main.scala b/example/src/main/scala/example/Main.scala index 117bc87c7..b8132b300 100644 --- a/example/src/main/scala/example/Main.scala +++ b/example/src/main/scala/example/Main.scala @@ -21,7 +21,7 @@ import example.config.AppConfig import sttp.client3.httpclient.zio.HttpClientZioBackend import zhttp.service.Server import zio._ -import zio.redis.{CodecSupplier, Redis, RedisExecutor} +import zio.redis._ import zio.schema.Schema import zio.schema.codec.{BinaryCodec, ProtobufCodec} @@ -33,8 +33,8 @@ object Main extends ZIOAppDefault { AppConfig.layer, ContributorsCache.layer, HttpClientZioBackend.layer(), - RedisExecutor.layer, Redis.layer, + SingleNodeExecutor.layer, ZLayer.succeed[CodecSupplier](new CodecSupplier { def get[A: Schema]: BinaryCodec[A] = ProtobufCodec.protobufCodec }) diff --git a/redis/src/main/scala/zio/redis/ClusterExecutor.scala b/redis/src/main/scala/zio/redis/ClusterExecutor.scala index 7fa83bda2..841754167 100644 --- a/redis/src/main/scala/zio/redis/ClusterExecutor.scala +++ b/redis/src/main/scala/zio/redis/ClusterExecutor.scala @@ -149,7 +149,7 @@ object ClusterExecutor { } yield ExecutorScope(executor, closableScope) private def redis(address: RedisUri) = { - val executorLayer = ZLayer.succeed(RedisConfig(address.host, address.port)) >>> RedisExecutor.layer + val executorLayer = ZLayer.succeed(RedisConfig(address.host, address.port)) >>> SingleNodeExecutor.layer val codecLayer = ZLayer.succeed[CodecSupplier](CodecSupplier.utf8) val redisLayer = executorLayer ++ codecLayer >>> Redis.layer for { diff --git a/redis/src/main/scala/zio/redis/RedisConnectionLive.scala b/redis/src/main/scala/zio/redis/RedisConnectionLive.scala index 67194fb1a..153b42d6b 100644 --- a/redis/src/main/scala/zio/redis/RedisConnectionLive.scala +++ b/redis/src/main/scala/zio/redis/RedisConnectionLive.scala @@ -78,8 +78,8 @@ private[redis] object RedisConnectionLive { } yield service } - lazy val default: ZLayer[Any, RedisError.IOError, RedisConnection] = - ZLayer.succeed(RedisConfig.Default) >>> layer + lazy val local: ZLayer[Any, RedisError.IOError, RedisConnection] = + ZLayer.succeed(RedisConfig.Local) >>> layer private[redis] def create(uri: RedisConfig): ZIO[Scope, RedisError.IOError, RedisConnection] = connect(new InetSocketAddress(uri.host, uri.port)) diff --git a/redis/src/main/scala/zio/redis/RedisExecutor.scala b/redis/src/main/scala/zio/redis/RedisExecutor.scala index 112e08e62..2daeb9887 100644 --- a/redis/src/main/scala/zio/redis/RedisExecutor.scala +++ b/redis/src/main/scala/zio/redis/RedisExecutor.scala @@ -16,16 +16,8 @@ package zio.redis -import zio.{IO, ZLayer} +import zio.IO trait RedisExecutor { private[redis] def execute(command: RespCommand): IO[RedisError, RespValue] } - -object RedisExecutor { - lazy val layer: ZLayer[RedisConfig, RedisError.IOError, RedisExecutor] = - RedisConnectionLive.layer >>> SingleNodeExecutor.layer - - lazy val local: ZLayer[Any, RedisError.IOError, RedisExecutor] = - RedisConnectionLive.default >>> SingleNodeExecutor.layer -} diff --git a/redis/src/main/scala/zio/redis/ResultBuilder.scala b/redis/src/main/scala/zio/redis/ResultBuilder.scala index fa629d2e8..400a6c8b1 100644 --- a/redis/src/main/scala/zio/redis/ResultBuilder.scala +++ b/redis/src/main/scala/zio/redis/ResultBuilder.scala @@ -42,6 +42,7 @@ private[redis] object ResultBuilder { def returning[R1: Schema, R2: Schema, R3: Schema]: IO[RedisError, F[R1, R2, R3]] } + @annotation.nowarn trait ResultOutputBuilder extends ResultBuilder { def returning[R: Output]: IO[RedisError, R] } diff --git a/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala b/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala index b227b9004..3274c7594 100644 --- a/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala +++ b/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala @@ -75,14 +75,11 @@ final class SingleNodeExecutor( } object SingleNodeExecutor { + lazy val layer: ZLayer[RedisConfig, RedisError.IOError, RedisExecutor] = + RedisConnectionLive.layer >>> makeLayer - lazy val layer: ZLayer[RedisConnection, RedisError.IOError, RedisExecutor] = - ZLayer.scoped { - for { - connection <- ZIO.service[RedisConnection] - executor <- create(connection) - } yield executor - } + lazy val local: ZLayer[Any, RedisError.IOError, RedisExecutor] = + RedisConnectionLive.local >>> makeLayer final case class Request(command: Chunk[RespValue.BulkString], promise: Promise[RedisError, RespValue]) @@ -99,4 +96,6 @@ object SingleNodeExecutor { _ <- logScopeFinalizer(s"$executor Node Executor is closed") } yield executor + private def makeLayer: ZLayer[RedisConnection, RedisError.IOError, RedisExecutor] = + ZLayer.scoped(ZIO.serviceWithZIO[RedisConnection](create)) } diff --git a/redis/src/main/scala/zio/redis/config.scala b/redis/src/main/scala/zio/redis/config.scala index 961d4831e..b5f9909e4 100644 --- a/redis/src/main/scala/zio/redis/config.scala +++ b/redis/src/main/scala/zio/redis/config.scala @@ -21,7 +21,7 @@ import zio.{Chunk, Duration, durationInt} final case class RedisConfig(host: String, port: Int) object RedisConfig { - lazy val Default: RedisConfig = RedisConfig("localhost", 6379) + lazy val Local: RedisConfig = RedisConfig("localhost", 6379) } final case class RedisClusterConfig(addresses: Chunk[RedisUri], retry: RetryClusterConfig = RetryClusterConfig.Default) diff --git a/redis/src/test/scala/zio/redis/ApiSpec.scala b/redis/src/test/scala/zio/redis/ApiSpec.scala index 0e3fc27b5..6ede21992 100644 --- a/redis/src/test/scala/zio/redis/ApiSpec.scala +++ b/redis/src/test/scala/zio/redis/ApiSpec.scala @@ -35,7 +35,7 @@ object ApiSpec streamsSuite, scriptingSpec ).provideShared( - RedisExecutor.local, + SingleNodeExecutor.local, Redis.layer, ZLayer.succeed(ProtobufCodecSupplier) ) diff --git a/redis/src/test/scala/zio/redis/ClusterExecutorSpec.scala b/redis/src/test/scala/zio/redis/ClusterExecutorSpec.scala index 34c86338e..ed0e39cba 100644 --- a/redis/src/test/scala/zio/redis/ClusterExecutorSpec.scala +++ b/redis/src/test/scala/zio/redis/ClusterExecutorSpec.scala @@ -67,7 +67,7 @@ object ClusterExecutorSpec extends BaseSpec { private final def getRedisNodeLayer(uri: RedisUri): Layer[Any, Redis] = ZLayer.make[Redis]( ZLayer.succeed(RedisConfig(uri.host, uri.port)), - RedisExecutor.layer, + SingleNodeExecutor.layer, ZLayer.succeed(ProtobufCodecSupplier), Redis.layer ) diff --git a/redis/src/test/scala/zio/redis/KeysSpec.scala b/redis/src/test/scala/zio/redis/KeysSpec.scala index 178fbee01..ea763604a 100644 --- a/redis/src/test/scala/zio/redis/KeysSpec.scala +++ b/redis/src/test/scala/zio/redis/KeysSpec.scala @@ -482,7 +482,6 @@ object KeysSpec { ZLayer .make[Redis]( ZLayer.succeed(RedisConfig("localhost", 6380)), - RedisConnectionLive.layer, SingleNodeExecutor.layer, ZLayer.succeed[CodecSupplier](ProtobufCodecSupplier), Redis.layer diff --git a/redis/src/test/scala/zio/redis/RedisConnectionLiveSpec.scala b/redis/src/test/scala/zio/redis/RedisConnectionLiveSpec.scala index d167d1db7..c06ac0b97 100644 --- a/redis/src/test/scala/zio/redis/RedisConnectionLiveSpec.scala +++ b/redis/src/test/scala/zio/redis/RedisConnectionLiveSpec.scala @@ -17,5 +17,5 @@ object RedisConnectionLiveSpec extends BaseSpec { res <- stream.read.runHead } yield assert(res)(isSome(equalTo('*'.toByte))) } - ).provideLayer(RedisConnectionLive.default.orDie) + ).provideLayer(RedisConnectionLive.local.orDie) } From 0119cd09f8de81ecb25723d5dd0329646cc2784f Mon Sep 17 00:00:00 2001 From: Dejan Mijic Date: Wed, 29 Mar 2023 02:33:10 +0200 Subject: [PATCH 05/19] Remove connection trait --- .../scala/zio/redis/ClusterExecutor.scala | 3 +- .../scala/zio/redis/RedisConnection.scala | 106 +++++++++++++- .../scala/zio/redis/RedisConnectionLive.scala | 129 ------------------ .../scala/zio/redis/SingleNodeExecutor.scala | 4 +- ...veSpec.scala => RedisConnectionSpec.scala} | 4 +- 5 files changed, 106 insertions(+), 140 deletions(-) delete mode 100644 redis/src/main/scala/zio/redis/RedisConnectionLive.scala rename redis/src/test/scala/zio/redis/{RedisConnectionLiveSpec.scala => RedisConnectionSpec.scala} (85%) diff --git a/redis/src/main/scala/zio/redis/ClusterExecutor.scala b/redis/src/main/scala/zio/redis/ClusterExecutor.scala index 841754167..b1aff93ee 100644 --- a/redis/src/main/scala/zio/redis/ClusterExecutor.scala +++ b/redis/src/main/scala/zio/redis/ClusterExecutor.scala @@ -18,7 +18,6 @@ package zio.redis import zio._ import zio.redis.ClusterExecutor._ -import zio.redis.RedisClusterConfig import zio.redis.api.Cluster.AskingCommand import zio.redis.options.Cluster._ @@ -142,7 +141,7 @@ object ClusterExecutor { private def connectToNode(address: RedisUri) = for { closableScope <- Scope.make - connection <- closableScope.extend[Any](RedisConnectionLive.create(RedisConfig(address.host, address.port))) + connection <- closableScope.extend[Any](RedisConnection.create(RedisConfig(address.host, address.port))) executor <- closableScope.extend[Any](SingleNodeExecutor.create(connection)) layerScope <- ZIO.scope _ <- layerScope.addFinalizerExit(closableScope.close(_)) diff --git a/redis/src/main/scala/zio/redis/RedisConnection.scala b/redis/src/main/scala/zio/redis/RedisConnection.scala index 1dce87aa6..1ab72b506 100644 --- a/redis/src/main/scala/zio/redis/RedisConnection.scala +++ b/redis/src/main/scala/zio/redis/RedisConnection.scala @@ -17,11 +17,107 @@ package zio.redis import zio._ -import zio.stream.Stream +import zio.stream.{Stream, ZStream} -import java.io.IOException +import java.io.{EOFException, IOException} +import java.net.{InetSocketAddress, SocketAddress, StandardSocketOptions} +import java.nio.ByteBuffer +import java.nio.channels.{AsynchronousSocketChannel, Channel, CompletionHandler} -private[redis] trait RedisConnection { - def read: Stream[IOException, Byte] - def write(chunk: Chunk[Byte]): IO[IOException, Option[Unit]] +private[redis] final class RedisConnection( + readBuffer: ByteBuffer, + writeBuffer: ByteBuffer, + channel: AsynchronousSocketChannel +) { + import RedisConnection._ + + val read: Stream[IOException, Byte] = + ZStream.repeatZIOChunkOption { + val receive = + for { + _ <- ZIO.succeed(readBuffer.clear()) + _ <- closeWith[Integer](channel)(channel.read(readBuffer, null, _)).filterOrFail(_ >= 0)(new EOFException()) + chunk <- ZIO.succeed { + readBuffer.flip() + val count = readBuffer.remaining() + val array = Array.ofDim[Byte](count) + readBuffer.get(array) + Chunk.fromArray(array) + } + } yield chunk + + receive.mapError { + case _: EOFException => None + case e: IOException => Some(e) + } + } + + def write(chunk: Chunk[Byte]): IO[IOException, Option[Unit]] = + ZIO.when(chunk.nonEmpty) { + ZIO.suspendSucceed { + writeBuffer.clear() + val (c, remainder) = chunk.splitAt(writeBuffer.capacity()) + writeBuffer.put(c.toArray) + writeBuffer.flip() + + closeWith[Integer](channel)(channel.write(writeBuffer, null, _)) + .repeatWhile(_ => writeBuffer.hasRemaining) + .zipRight(write(remainder)) + .map(_.getOrElse(())) + } + } +} + +private[redis] object RedisConnection { + lazy val layer: ZLayer[RedisConfig, RedisError.IOError, RedisConnection] = + ZLayer.scoped(ZIO.serviceWithZIO[RedisConfig](create)) + + lazy val local: ZLayer[Any, RedisError.IOError, RedisConnection] = + ZLayer.succeed(RedisConfig.Local) >>> layer + + def create(uri: RedisConfig): ZIO[Scope, RedisError.IOError, RedisConnection] = + connect(new InetSocketAddress(uri.host, uri.port)) + + def connect(address: => SocketAddress): ZIO[Scope, RedisError.IOError, RedisConnection] = + (for { + address <- ZIO.succeed(address) + makeBuffer = ZIO.succeed(ByteBuffer.allocateDirect(ResponseBufferSize)) + readBuffer <- makeBuffer + writeBuffer <- makeBuffer + channel <- openChannel(address) + _ <- logScopeFinalizer("Redis connection is closed") + } yield new RedisConnection(readBuffer, writeBuffer, channel)).mapError(RedisError.IOError(_)) + + private final val ResponseBufferSize = 1024 + + private def completionHandler[A](k: IO[IOException, A] => Unit): CompletionHandler[A, Any] = + new CompletionHandler[A, Any] { + def completed(result: A, u: Any): Unit = k(ZIO.succeed(result)) + + def failed(t: Throwable, u: Any): Unit = + t match { + case e: IOException => k(ZIO.fail(e)) + case _ => k(ZIO.die(t)) + } + } + + private def closeWith[A](channel: Channel)(op: CompletionHandler[A, Any] => Any): IO[IOException, A] = + ZIO.asyncInterrupt { k => + op(completionHandler(k)) + Left(ZIO.attempt(channel.close()).ignore) + } + + private def openChannel(address: SocketAddress): ZIO[Scope, IOException, AsynchronousSocketChannel] = + ZIO.fromAutoCloseable { + for { + channel <- ZIO.attempt { + val channel = AsynchronousSocketChannel.open() + channel.setOption(StandardSocketOptions.SO_KEEPALIVE, Boolean.box(true)) + channel.setOption(StandardSocketOptions.TCP_NODELAY, Boolean.box(true)) + channel + } + _ <- closeWith[Void](channel)(channel.connect(address, null, _)) + _ <- ZIO.logInfo(s"Connected to the redis server with address $address.") + } yield channel + }.refineToOrDie[IOException] } diff --git a/redis/src/main/scala/zio/redis/RedisConnectionLive.scala b/redis/src/main/scala/zio/redis/RedisConnectionLive.scala deleted file mode 100644 index 153b42d6b..000000000 --- a/redis/src/main/scala/zio/redis/RedisConnectionLive.scala +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright 2021 John A. De Goes and the ZIO contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package zio.redis - -import zio._ -import zio.stream.{Stream, ZStream} - -import java.io.{EOFException, IOException} -import java.net.{InetSocketAddress, SocketAddress, StandardSocketOptions} -import java.nio.ByteBuffer -import java.nio.channels.{AsynchronousSocketChannel, Channel, CompletionHandler} - -private[redis] final class RedisConnectionLive( - readBuffer: ByteBuffer, - writeBuffer: ByteBuffer, - channel: AsynchronousSocketChannel -) extends RedisConnection { - import RedisConnectionLive._ - - val read: Stream[IOException, Byte] = - ZStream.repeatZIOChunkOption { - val receive = - for { - _ <- ZIO.succeed(readBuffer.clear()) - _ <- closeWith[Integer](channel)(channel.read(readBuffer, null, _)).filterOrFail(_ >= 0)(new EOFException()) - chunk <- ZIO.succeed { - readBuffer.flip() - val count = readBuffer.remaining() - val array = Array.ofDim[Byte](count) - readBuffer.get(array) - Chunk.fromArray(array) - } - } yield chunk - - receive.mapError { - case _: EOFException => None - case e: IOException => Some(e) - } - } - - def write(chunk: Chunk[Byte]): IO[IOException, Option[Unit]] = - ZIO.when(chunk.nonEmpty) { - ZIO.suspendSucceed { - writeBuffer.clear() - val (c, remainder) = chunk.splitAt(writeBuffer.capacity()) - writeBuffer.put(c.toArray) - writeBuffer.flip() - - closeWith[Integer](channel)(channel.write(writeBuffer, null, _)) - .repeatWhile(_ => writeBuffer.hasRemaining) - .zipRight(write(remainder)) - .map(_.getOrElse(())) - } - } -} - -private[redis] object RedisConnectionLive { - - lazy val layer: ZLayer[RedisConfig, RedisError.IOError, RedisConnection] = - ZLayer.scoped { - for { - config <- ZIO.service[RedisConfig] - service <- create(config) - } yield service - } - - lazy val local: ZLayer[Any, RedisError.IOError, RedisConnection] = - ZLayer.succeed(RedisConfig.Local) >>> layer - - private[redis] def create(uri: RedisConfig): ZIO[Scope, RedisError.IOError, RedisConnection] = - connect(new InetSocketAddress(uri.host, uri.port)) - - private[redis] def connect(address: => SocketAddress): ZIO[Scope, RedisError.IOError, RedisConnection] = - (for { - address <- ZIO.succeed(address) - makeBuffer = ZIO.succeed(ByteBuffer.allocateDirect(ResponseBufferSize)) - readBuffer <- makeBuffer - writeBuffer <- makeBuffer - channel <- openChannel(address) - _ <- logScopeFinalizer("Redis connection is closed") - } yield new RedisConnectionLive(readBuffer, writeBuffer, channel)).mapError(RedisError.IOError(_)) - - private final val ResponseBufferSize = 1024 - - private def completionHandler[A](k: IO[IOException, A] => Unit): CompletionHandler[A, Any] = - new CompletionHandler[A, Any] { - def completed(result: A, u: Any): Unit = k(ZIO.succeed(result)) - - def failed(t: Throwable, u: Any): Unit = - t match { - case e: IOException => k(ZIO.fail(e)) - case _ => k(ZIO.die(t)) - } - } - - private def closeWith[A](channel: Channel)(op: CompletionHandler[A, Any] => Any): IO[IOException, A] = - ZIO.asyncInterrupt { k => - op(completionHandler(k)) - Left(ZIO.attempt(channel.close()).ignore) - } - - private def openChannel(address: SocketAddress): ZIO[Scope, IOException, AsynchronousSocketChannel] = - ZIO.fromAutoCloseable { - for { - channel <- ZIO.attempt { - val channel = AsynchronousSocketChannel.open() - channel.setOption(StandardSocketOptions.SO_KEEPALIVE, Boolean.box(true)) - channel.setOption(StandardSocketOptions.TCP_NODELAY, Boolean.box(true)) - channel - } - _ <- closeWith[Void](channel)(channel.connect(address, null, _)) - _ <- ZIO.logInfo(s"Connected to the redis server with address $address.") - } yield channel - }.refineToOrDie[IOException] -} diff --git a/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala b/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala index 3274c7594..a1a203e51 100644 --- a/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala +++ b/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala @@ -76,10 +76,10 @@ final class SingleNodeExecutor( object SingleNodeExecutor { lazy val layer: ZLayer[RedisConfig, RedisError.IOError, RedisExecutor] = - RedisConnectionLive.layer >>> makeLayer + RedisConnection.layer >>> makeLayer lazy val local: ZLayer[Any, RedisError.IOError, RedisExecutor] = - RedisConnectionLive.local >>> makeLayer + RedisConnection.local >>> makeLayer final case class Request(command: Chunk[RespValue.BulkString], promise: Promise[RedisError, RespValue]) diff --git a/redis/src/test/scala/zio/redis/RedisConnectionLiveSpec.scala b/redis/src/test/scala/zio/redis/RedisConnectionSpec.scala similarity index 85% rename from redis/src/test/scala/zio/redis/RedisConnectionLiveSpec.scala rename to redis/src/test/scala/zio/redis/RedisConnectionSpec.scala index c06ac0b97..2ac7b194e 100644 --- a/redis/src/test/scala/zio/redis/RedisConnectionLiveSpec.scala +++ b/redis/src/test/scala/zio/redis/RedisConnectionSpec.scala @@ -6,7 +6,7 @@ import zio.{Chunk, ZIO} import java.nio.charset.StandardCharsets -object RedisConnectionLiveSpec extends BaseSpec { +object RedisConnectionSpec extends BaseSpec { override def spec: Spec[Environment, Any] = suite("Redis Connection Byte stream")( test("can write and read") { @@ -17,5 +17,5 @@ object RedisConnectionLiveSpec extends BaseSpec { res <- stream.read.runHead } yield assert(res)(isSome(equalTo('*'.toByte))) } - ).provideLayer(RedisConnectionLive.local.orDie) + ).provideLayer(RedisConnection.local) } From 79a80fa1f19f63f6ce9f369095705d0086e01186 Mon Sep 17 00:00:00 2001 From: Dejan Mijic Date: Wed, 29 Mar 2023 02:40:27 +0200 Subject: [PATCH 06/19] Fix 2.12 errors --- redis/src/test/scala/zio/redis/ApiSpec.scala | 1 - redis/src/test/scala/zio/redis/CRC16Spec.scala | 1 - redis/src/test/scala/zio/redis/ClusterExecutorSpec.scala | 2 +- redis/src/test/scala/zio/redis/KeysSpec.scala | 1 - redis/src/test/scala/zio/redis/ProtobufCodecSupplier.scala | 3 +-- 5 files changed, 2 insertions(+), 6 deletions(-) diff --git a/redis/src/test/scala/zio/redis/ApiSpec.scala b/redis/src/test/scala/zio/redis/ApiSpec.scala index 6ede21992..9591a05a9 100644 --- a/redis/src/test/scala/zio/redis/ApiSpec.scala +++ b/redis/src/test/scala/zio/redis/ApiSpec.scala @@ -1,7 +1,6 @@ package zio.redis import zio._ -import zio.redis.{ProtobufCodecSupplier, RedisClusterConfig} import zio.test.TestAspect._ import zio.test._ object ApiSpec diff --git a/redis/src/test/scala/zio/redis/CRC16Spec.scala b/redis/src/test/scala/zio/redis/CRC16Spec.scala index 80b539c39..89cb136eb 100644 --- a/redis/src/test/scala/zio/redis/CRC16Spec.scala +++ b/redis/src/test/scala/zio/redis/CRC16Spec.scala @@ -1,7 +1,6 @@ package zio.redis import zio.Chunk -import zio.redis.{BaseSpec, CRC16} import zio.test.Assertion._ import zio.test._ diff --git a/redis/src/test/scala/zio/redis/ClusterExecutorSpec.scala b/redis/src/test/scala/zio/redis/ClusterExecutorSpec.scala index ed0e39cba..e37bbb819 100644 --- a/redis/src/test/scala/zio/redis/ClusterExecutorSpec.scala +++ b/redis/src/test/scala/zio/redis/ClusterExecutorSpec.scala @@ -1,9 +1,9 @@ package zio.redis import zio.redis.options.Cluster.{Slot, SlotsAmount} -import zio.redis.{CRC16, ProtobufCodecSupplier, RedisClusterConfig} import zio.test._ import zio.{Chunk, Layer, ZIO, ZLayer, durationInt} + object ClusterExecutorSpec extends BaseSpec { def spec: Spec[TestEnvironment, Any] = suite("cluster executor")( diff --git a/redis/src/test/scala/zio/redis/KeysSpec.scala b/redis/src/test/scala/zio/redis/KeysSpec.scala index ea763604a..3fc4ff9f0 100644 --- a/redis/src/test/scala/zio/redis/KeysSpec.scala +++ b/redis/src/test/scala/zio/redis/KeysSpec.scala @@ -1,7 +1,6 @@ package zio.redis import zio._ -import zio.redis.ProtobufCodecSupplier import zio.redis.RedisError.ProtocolError import zio.test.Assertion.{exists => _, _} import zio.test.TestAspect.{restore => _, _} diff --git a/redis/src/test/scala/zio/redis/ProtobufCodecSupplier.scala b/redis/src/test/scala/zio/redis/ProtobufCodecSupplier.scala index 903287276..01673e158 100644 --- a/redis/src/test/scala/zio/redis/ProtobufCodecSupplier.scala +++ b/redis/src/test/scala/zio/redis/ProtobufCodecSupplier.scala @@ -1,9 +1,8 @@ package zio.redis -import zio.redis.CodecSupplier import zio.schema.Schema import zio.schema.codec.{BinaryCodec, ProtobufCodec} object ProtobufCodecSupplier extends CodecSupplier { - implicit def get[A: Schema]: BinaryCodec[A] = ProtobufCodec.protobufCodec + def get[A: Schema]: BinaryCodec[A] = ProtobufCodec.protobufCodec } From 89e61f6e24ddd7d3ac64aafc5501f5dafa4a980f Mon Sep 17 00:00:00 2001 From: Dejan Mijic Date: Wed, 29 Mar 2023 02:46:45 +0200 Subject: [PATCH 07/19] Update README --- README.md | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index e895774e7..611026ff4 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ # ZIO Redis -[![Development](https://img.shields.io/badge/Project%20Stage-Development-green.svg)](https://github.com/zio/zio/wiki/Project-Stages) ![CI Badge](https://github.com/zio/zio-redis/workflows/CI/badge.svg) [![Sonatype Releases](https://img.shields.io/nexus/r/https/oss.sonatype.org/dev.zio/zio-redis_2.13.svg?label=Sonatype%20Release)](https://oss.sonatype.org/content/repositories/releases/dev/zio/zio-redis_2.13/) [![Sonatype Snapshots](https://img.shields.io/nexus/s/https/oss.sonatype.org/dev.zio/zio-redis_2.13.svg?label=Sonatype%20Snapshot)](https://oss.sonatype.org/content/repositories/snapshots/dev/zio/zio-redis_2.13/) [![javadoc](https://javadoc.io/badge2/dev.zio/zio-redis-docs_2.13/javadoc.svg)](https://javadoc.io/doc/dev.zio/zio-redis-docs_2.13) [![ZIO Redis](https://img.shields.io/github/stars/zio/zio-redis?style=social)](https://github.com/zio/zio-redis) +[![Development](https://img.shields.io/badge/Project%20Stage-Development-green.svg)](https://github.com/zio/zio/wiki/Project-Stages) ![CI Badge](https://github.com/zio/zio-redis/workflows/CI/badge.svg) [![Sonatype Snapshots](https://img.shields.io/nexus/s/https/oss.sonatype.org/dev.zio/zio-redis_2.13.svg?label=Sonatype%20Snapshot)](https://oss.sonatype.org/content/repositories/snapshots/dev/zio/zio-redis_2.13/) [![ZIO Redis](https://img.shields.io/github/stars/zio/zio-redis?style=social)](https://github.com/zio/zio-redis) ## Introduction @@ -17,7 +17,7 @@ instances. To use ZIO Redis, add the following line to your `build.sbt`: ```scala -libraryDependencies += "dev.zio" %% "zio-redis" % "0.1.0" +libraryDependencies += "dev.zio" %% "zio-redis" % "" ``` ## Example @@ -32,7 +32,7 @@ To run this example we should put following dependencies in our `build.sbt` file ```scala libraryDependencies ++= Seq( - "dev.zio" %% "zio-redis" % "0.1.0", + "dev.zio" %% "zio-redis" % "", "dev.zio" %% "zio-schema-protobuf" % "0.4.9" ) ``` @@ -61,8 +61,7 @@ object ZIORedisExample extends ZIOAppDefault { override def run = myApp.provide( Redis.layer, - RedisExecutor.layer, - ZLayer.succeed(RedisConfig.Default), + SingleNodeExecutor.local, ZLayer.succeed[CodecSupplier](ProtobufCodecSupplier) ) } @@ -73,7 +72,7 @@ object ZIORedisExample extends ZIOAppDefault { To test you can use the embedded redis instance by adding to your build: ```scala -libraryDependencies := "dev.zio" %% "zio-redis-embedded" % "0.1.0" +libraryDependencies := "dev.zio" %% "zio-redis-embedded" % "" ``` Then you can supply `EmbeddedRedis.layer.orDie` as your `RedisConfig` and you're good to go! @@ -108,8 +107,8 @@ object EmbeddedRedisSpec extends ZIOSpecDefault { } yield assert(found)(isSome(equalTo(item))) } ).provideShared( - EmbeddedRedis.layer.orDie, - RedisExecutor.layer.orDie, + EmbeddedRedis.layer, + SingleNodeExecutor.layer, ZLayer.succeed[CodecSupplier](ProtobufCodecSupplier), Redis.layer ) @@ TestAspect.silentLogging From 3fc8b6c5e71004f50bca60804fd7d2703f42adbf Mon Sep 17 00:00:00 2001 From: Dejan Mijic Date: Wed, 29 Mar 2023 02:56:56 +0200 Subject: [PATCH 08/19] Rename internals --- redis/src/main/scala/zio/redis/Redis.scala | 8 ++++---- redis/src/main/scala/zio/redis/RedisEnvironment.scala | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/redis/src/main/scala/zio/redis/Redis.scala b/redis/src/main/scala/zio/redis/Redis.scala index 7452cd92c..7c261eb5a 100644 --- a/redis/src/main/scala/zio/redis/Redis.scala +++ b/redis/src/main/scala/zio/redis/Redis.scala @@ -36,10 +36,10 @@ object Redis { lazy val layer: URLayer[RedisExecutor with CodecSupplier, Redis] = ZLayer { for { - executor <- ZIO.service[RedisExecutor] - codec <- ZIO.service[CodecSupplier] - } yield Live(codec, executor) + codecSupplier <- ZIO.service[CodecSupplier] + executor <- ZIO.service[RedisExecutor] + } yield Live(codecSupplier, executor) } - private final case class Live(codec: CodecSupplier, executor: RedisExecutor) extends Redis + private final case class Live(codecSupplier: CodecSupplier, executor: RedisExecutor) extends Redis } diff --git a/redis/src/main/scala/zio/redis/RedisEnvironment.scala b/redis/src/main/scala/zio/redis/RedisEnvironment.scala index 84a1775be..10b38fe67 100644 --- a/redis/src/main/scala/zio/redis/RedisEnvironment.scala +++ b/redis/src/main/scala/zio/redis/RedisEnvironment.scala @@ -20,8 +20,8 @@ import zio.schema.Schema import zio.schema.codec.BinaryCodec private[redis] trait RedisEnvironment { - protected def codec: CodecSupplier + protected def codecSupplier: CodecSupplier protected def executor: RedisExecutor - implicit def summonCodec[A: Schema]: BinaryCodec[A] = codec.get + protected final implicit def codec[A: Schema]: BinaryCodec[A] = codecSupplier.get } From cfd8eb56d3aae27ff55e1d3e35754d420fb1c7f9 Mon Sep 17 00:00:00 2001 From: Dejan Mijic Date: Wed, 29 Mar 2023 03:03:02 +0200 Subject: [PATCH 09/19] Align internal visibility --- redis/src/main/scala/zio/redis/RespValue.scala | 8 ++++---- redis/src/main/scala/zio/redis/SingleNodeExecutor.scala | 2 +- redis/src/test/scala/zio/redis/RespValueSpec.scala | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/redis/src/main/scala/zio/redis/RespValue.scala b/redis/src/main/scala/zio/redis/RespValue.scala index 64e43cc12..5f06bcf96 100644 --- a/redis/src/main/scala/zio/redis/RespValue.scala +++ b/redis/src/main/scala/zio/redis/RespValue.scala @@ -90,7 +90,7 @@ private[redis] object RespValue { } } - private[redis] final val decoder = { + final val Decoder: ZPipeline[Any, RedisError.ProtocolError, Byte, Option[RespValue]] = { import internal.State // ZSink fold will return a State.Start when contFn is false @@ -107,11 +107,11 @@ private[redis] object RespValue { .andThen(ZPipeline.fromSink(lineProcessor)) } - private[redis] def array(values: RespValue*): Array = Array(Chunk.fromIterable(values)) + def array(values: RespValue*): Array = Array(Chunk.fromIterable(values)) - private[redis] def bulkString(s: String): BulkString = BulkString(Chunk.fromArray(s.getBytes(StandardCharsets.UTF_8))) + def bulkString(s: String): BulkString = BulkString(Chunk.fromArray(s.getBytes(StandardCharsets.UTF_8))) - private[redis] def decode(bytes: Chunk[Byte]): String = new String(bytes.toArray, StandardCharsets.UTF_8) + def decode(bytes: Chunk[Byte]): String = new String(bytes.toArray, StandardCharsets.UTF_8) private object internal { object Headers { diff --git a/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala b/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala index a1a203e51..1cd267d6f 100644 --- a/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala +++ b/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala @@ -68,7 +68,7 @@ final class SingleNodeExecutor( private def receive: IO[RedisError, Unit] = connection.read .mapError(RedisError.IOError(_)) - .via(RespValue.decoder) + .via(RespValue.Decoder) .collectSome .foreach(response => resQueue.take.flatMap(_.succeed(response))) diff --git a/redis/src/test/scala/zio/redis/RespValueSpec.scala b/redis/src/test/scala/zio/redis/RespValueSpec.scala index f4a8db8fb..8b6b9865d 100644 --- a/redis/src/test/scala/zio/redis/RespValueSpec.scala +++ b/redis/src/test/scala/zio/redis/RespValueSpec.scala @@ -35,7 +35,7 @@ object RespValueSpec extends BaseSpec { zio.stream.ZStream .fromChunk(values) .mapConcat(_.serialize) - .via(RespValue.decoder) + .via(RespValue.Decoder) .collect { case Some(value) => value } From 5e1a051c320855a11df6cbccfdb4d2f70e8ec673 Mon Sep 17 00:00:00 2001 From: Dejan Mijic Date: Wed, 29 Mar 2023 09:39:35 +0200 Subject: [PATCH 10/19] Remove package qualifier --- .../src/main/scala/zio/redis/benchmarks/BenchmarkRuntime.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/src/main/scala/zio/redis/benchmarks/BenchmarkRuntime.scala b/benchmarks/src/main/scala/zio/redis/benchmarks/BenchmarkRuntime.scala index 30280827f..52456a35e 100644 --- a/benchmarks/src/main/scala/zio/redis/benchmarks/BenchmarkRuntime.scala +++ b/benchmarks/src/main/scala/zio/redis/benchmarks/BenchmarkRuntime.scala @@ -25,7 +25,7 @@ import zio.schema.codec.{BinaryCodec, ProtobufCodec} trait BenchmarkRuntime { final def execute(query: ZIO[Redis, RedisError, Unit]): Unit = Unsafe.unsafe { implicit unsafe => - zio.Runtime.default.unsafe.run(query.provideLayer(BenchmarkRuntime.Layer)).getOrThrowFiberFailure() + Runtime.default.unsafe.run(query.provideLayer(BenchmarkRuntime.Layer)).getOrThrowFiberFailure() } final def execute[Client: QueryRunner](query: Client => CIO[Unit]): Unit = From c87b77cc3e8116a80d9f9772d823da9683237e0d Mon Sep 17 00:00:00 2001 From: Dejan Mijic Date: Wed, 29 Mar 2023 10:29:54 +0200 Subject: [PATCH 11/19] Rename stringify to asString --- redis/src/main/scala/zio/redis/Input.scala | 70 +++++++++---------- .../main/scala/zio/redis/api/Cluster.scala | 8 +-- .../main/scala/zio/redis/api/SortedSets.scala | 30 ++++---- .../main/scala/zio/redis/api/Strings.scala | 2 +- .../scala/zio/redis/options/Cluster.scala | 2 +- .../scala/zio/redis/options/Connection.scala | 14 ++-- .../main/scala/zio/redis/options/Geo.scala | 8 +-- .../main/scala/zio/redis/options/Keys.scala | 10 +-- .../main/scala/zio/redis/options/Lists.scala | 4 +- .../scala/zio/redis/options/Scripting.scala | 4 +- .../main/scala/zio/redis/options/Shared.scala | 4 +- .../scala/zio/redis/options/SortedSets.scala | 16 ++--- .../scala/zio/redis/options/Streams.scala | 8 +-- .../scala/zio/redis/options/Strings.scala | 14 ++-- .../src/test/scala/zio/redis/InputSpec.scala | 36 +++++----- 15 files changed, 115 insertions(+), 115 deletions(-) diff --git a/redis/src/main/scala/zio/redis/Input.scala b/redis/src/main/scala/zio/redis/Input.scala index 7feee7d23..f12bf5b55 100644 --- a/redis/src/main/scala/zio/redis/Input.scala +++ b/redis/src/main/scala/zio/redis/Input.scala @@ -37,22 +37,22 @@ private[redis] object Input { case object AbsTtlInput extends Input[AbsTtl] { def encode(data: AbsTtl): RespCommand = - RespCommand(RespCommandArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.asString)) } case object AddressInput extends Input[Address] { def encode(data: Address): RespCommand = - RespCommand(RespCommandArgument.Unknown(data.stringify)) + RespCommand(RespCommandArgument.Unknown(data.asString)) } case object AggregateInput extends Input[Aggregate] { def encode(data: Aggregate): RespCommand = - RespCommand(RespCommandArgument.Literal("AGGREGATE"), RespCommandArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal("AGGREGATE"), RespCommandArgument.Literal(data.asString)) } case object AlphaInput extends Input[Alpha] { def encode(data: Alpha): RespCommand = - RespCommand(RespCommandArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.asString)) } case object AuthInput extends Input[Auth] { @@ -97,25 +97,25 @@ private[redis] object Input { case BitFieldGet(t, o) => Chunk( RespCommandArgument.Literal("GET"), - RespCommandArgument.Unknown(t.stringify), + RespCommandArgument.Unknown(t.asString), RespCommandArgument.Unknown(o.toString) ) case BitFieldSet(t, o, v) => Chunk( RespCommandArgument.Literal("SET"), - RespCommandArgument.Unknown(t.stringify), + RespCommandArgument.Unknown(t.asString), RespCommandArgument.Unknown(o.toString), RespCommandArgument.Unknown(v.toString) ) case BitFieldIncr(t, o, i) => Chunk( RespCommandArgument.Literal("INCRBY"), - RespCommandArgument.Unknown(t.stringify), + RespCommandArgument.Unknown(t.asString), RespCommandArgument.Unknown(o.toString), RespCommandArgument.Unknown(i.toString) ) case bfo: BitFieldOverflow => - Chunk(RespCommandArgument.Literal("OVERFLOW"), RespCommandArgument.Literal(bfo.stringify)) + Chunk(RespCommandArgument.Literal("OVERFLOW"), RespCommandArgument.Literal(bfo.asString)) } RespCommand(respArgs) } @@ -123,7 +123,7 @@ private[redis] object Input { case object BitOperationInput extends Input[BitOperation] { def encode(data: BitOperation): RespCommand = - RespCommand(RespCommandArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.asString)) } case object BitPosRangeInput extends Input[BitPosRange] { @@ -141,19 +141,19 @@ private[redis] object Input { case object ChangedInput extends Input[Changed] { def encode(data: Changed): RespCommand = - RespCommand(RespCommandArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.asString)) } case object ClientKillInput extends Input[ClientKillFilter] { def encode(data: ClientKillFilter): RespCommand = data match { case addr: ClientKillFilter.Address => - RespCommand(RespCommandArgument.Literal("ADDR"), RespCommandArgument.Unknown(addr.stringify)) + RespCommand(RespCommandArgument.Literal("ADDR"), RespCommandArgument.Unknown(addr.asString)) case laddr: ClientKillFilter.LocalAddress => - RespCommand(RespCommandArgument.Literal("LADDR"), RespCommandArgument.Unknown(laddr.stringify)) + RespCommand(RespCommandArgument.Literal("LADDR"), RespCommandArgument.Unknown(laddr.asString)) case ClientKillFilter.Id(clientId) => RespCommand(RespCommandArgument.Literal("ID"), RespCommandArgument.Unknown(clientId.toString)) case ClientKillFilter.Type(clientType) => - RespCommand(RespCommandArgument.Literal("TYPE"), RespCommandArgument.Literal(clientType.stringify)) + RespCommand(RespCommandArgument.Literal("TYPE"), RespCommandArgument.Literal(clientType.asString)) case ClientKillFilter.User(username) => RespCommand(RespCommandArgument.Literal("USER"), RespCommandArgument.Unknown(username)) case ClientKillFilter.SkipMe(skip) => @@ -163,7 +163,7 @@ private[redis] object Input { case object ClientPauseModeInput extends Input[ClientPauseMode] { def encode(data: ClientPauseMode): RespCommand = - RespCommand(RespCommandArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.asString)) } case object ClientTrackingInput @@ -198,7 +198,7 @@ private[redis] object Input { case object CopyInput extends Input[Copy] { def encode(data: Copy): RespCommand = - RespCommand(RespCommandArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.asString)) } case object CountInput extends Input[Count] { @@ -208,7 +208,7 @@ private[redis] object Input { case object RedisTypeInput extends Input[RedisType] { def encode(data: RedisType): RespCommand = - RespCommand(RespCommandArgument.Literal("TYPE"), RespCommandArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal("TYPE"), RespCommandArgument.Literal(data.asString)) } case object PatternInput extends Input[Pattern] { @@ -223,12 +223,12 @@ private[redis] object Input { case object PositionInput extends Input[Position] { def encode(data: Position): RespCommand = - RespCommand(RespCommandArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.asString)) } case object SideInput extends Input[Side] { def encode(data: Side): RespCommand = - RespCommand(RespCommandArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.asString)) } case object DoubleInput extends Input[Double] { @@ -267,12 +267,12 @@ private[redis] object Input { case object IncrementInput extends Input[Increment] { def encode(data: Increment): RespCommand = - RespCommand(RespCommandArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.asString)) } case object KeepTtlInput extends Input[KeepTtl] { def encode(data: KeepTtl): RespCommand = - RespCommand(RespCommandArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.asString)) } case object LimitInput extends Input[Limit] { @@ -313,12 +313,12 @@ private[redis] object Input { case object OrderInput extends Input[Order] { def encode(data: Order): RespCommand = - RespCommand(RespCommandArgument.Unknown(data.stringify)) + RespCommand(RespCommandArgument.Unknown(data.asString)) } case object RadiusUnitInput extends Input[RadiusUnit] { def encode(data: RadiusUnit): RespCommand = - RespCommand(RespCommandArgument.Unknown(data.stringify)) + RespCommand(RespCommandArgument.Unknown(data.asString)) } case object RangeInput extends Input[Range] { @@ -328,7 +328,7 @@ private[redis] object Input { case object ReplaceInput extends Input[Replace] { def encode(data: Replace): RespCommand = - RespCommand(RespCommandArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.asString)) } case object StoreDistInput extends Input[StoreDist] { @@ -415,7 +415,7 @@ private[redis] object Input { RespCommandArgument.Unknown(data.id) ) - RespCommand(if (data.mkStream) chunk :+ RespCommandArgument.Literal(MkStream.stringify) else chunk) + RespCommand(if (data.mkStream) chunk :+ RespCommandArgument.Literal(MkStream.asString) else chunk) } } @@ -478,7 +478,7 @@ private[redis] object Input { case object NoAckInput extends Input[NoAck] { def encode(data: NoAck): RespCommand = - RespCommand(RespCommandArgument.Unknown(data.stringify)) + RespCommand(RespCommandArgument.Unknown(data.asString)) } case object StreamMaxLenInput extends Input[StreamMaxLen] { @@ -605,7 +605,7 @@ private[redis] object Input { case object UpdateInput extends Input[Update] { def encode(data: Update): RespCommand = - RespCommand(RespCommandArgument.Unknown(data.stringify)) + RespCommand(RespCommandArgument.Unknown(data.asString)) } final case class GetExPersistInput[K: BinaryCodec]() extends Input[(K, Boolean)] { @@ -649,7 +649,7 @@ private[redis] object Input { case object UnblockBehaviorInput extends Input[UnblockBehavior] { def encode(data: UnblockBehavior): RespCommand = - RespCommand(RespCommandArgument.Unknown(data.stringify)) + RespCommand(RespCommandArgument.Unknown(data.asString)) } final case class Varargs[-A](input: Input[A]) extends Input[Iterable[A]] { @@ -673,42 +673,42 @@ private[redis] object Input { case object ScriptDebugInput extends Input[DebugMode] { def encode(data: DebugMode): RespCommand = - RespCommand(RespCommandArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.asString)) } case object ScriptFlushInput extends Input[FlushMode] { def encode(data: FlushMode): RespCommand = - RespCommand(RespCommandArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.asString)) } case object WithScoresInput extends Input[WithScores] { def encode(data: WithScores): RespCommand = - RespCommand(RespCommandArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.asString)) } case object WithCoordInput extends Input[WithCoord] { def encode(data: WithCoord): RespCommand = - RespCommand(RespCommandArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.asString)) } case object WithDistInput extends Input[WithDist] { def encode(data: WithDist): RespCommand = - RespCommand(RespCommandArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.asString)) } case object WithHashInput extends Input[WithHash] { def encode(data: WithHash): RespCommand = - RespCommand(RespCommandArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.asString)) } case object WithForceInput extends Input[WithForce] { def encode(data: WithForce): RespCommand = - RespCommand(RespCommandArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.asString)) } case object WithJustIdInput extends Input[WithJustId] { def encode(data: WithJustId): RespCommand = - RespCommand(RespCommandArgument.Literal(data.stringify)) + RespCommand(RespCommandArgument.Literal(data.asString)) } case object YesNoInput extends Input[Boolean] { diff --git a/redis/src/main/scala/zio/redis/api/Cluster.scala b/redis/src/main/scala/zio/redis/api/Cluster.scala index 6240f75a0..19672269c 100644 --- a/redis/src/main/scala/zio/redis/api/Cluster.scala +++ b/redis/src/main/scala/zio/redis/api/Cluster.scala @@ -58,7 +58,7 @@ trait Cluster extends RedisEnvironment { final def setSlotStable(slot: Slot): IO[RedisError, Unit] = { val command = RedisCommand(ClusterSetSlots, Tuple2(LongInput, ArbitraryValueInput[String]()), UnitOutput, executor) - command.run((slot.number, Stable.stringify)) + command.run((slot.number, Stable.asString)) } /** @@ -79,7 +79,7 @@ trait Cluster extends RedisEnvironment { UnitOutput, executor ) - command.run((slot.number, Migrating.stringify, nodeId)) + command.run((slot.number, Migrating.asString, nodeId)) } /** @@ -100,7 +100,7 @@ trait Cluster extends RedisEnvironment { UnitOutput, executor ) - command.run((slot.number, Importing.stringify, nodeId)) + command.run((slot.number, Importing.asString, nodeId)) } /** @@ -121,7 +121,7 @@ trait Cluster extends RedisEnvironment { UnitOutput, executor ) - command.run((slot.number, Node.stringify, nodeId)) + command.run((slot.number, Node.asString, nodeId)) } } diff --git a/redis/src/main/scala/zio/redis/api/SortedSets.scala b/redis/src/main/scala/zio/redis/api/SortedSets.scala index 1f82c6af2..de1016ae5 100644 --- a/redis/src/main/scala/zio/redis/api/SortedSets.scala +++ b/redis/src/main/scala/zio/redis/api/SortedSets.scala @@ -262,7 +262,7 @@ trait SortedSets extends RedisEnvironment { .map(_.map { case (m, s) => MemberScore(s, m) }), executor ) - command.run((inputKeysNum, (key, keys.toList), WithScores.stringify)) + command.run((inputKeysNum, (key, keys.toList), WithScores.asString)) } } @@ -398,7 +398,7 @@ trait SortedSets extends RedisEnvironment { .map(_.map { case (m, s) => MemberScore(s, m) }), executor ) - command.run((inputKeysNum, (key, keys.toList), aggregate, weights, WithScores.stringify)) + command.run((inputKeysNum, (key, keys.toList), aggregate, weights, WithScores.asString)) } } @@ -458,7 +458,7 @@ trait SortedSets extends RedisEnvironment { LongOutput, executor ) - command.run((key, lexRange.min.stringify, lexRange.max.stringify)) + command.run((key, lexRange.min.asString, lexRange.max.asString)) } /** @@ -561,7 +561,7 @@ trait SortedSets extends RedisEnvironment { .map(_.map { case (m, s) => MemberScore(s, m) }), executor ) - command.run((key, range, WithScores.stringify)) + command.run((key, range, WithScores.asString)) } } @@ -596,7 +596,7 @@ trait SortedSets extends RedisEnvironment { ChunkOutput(ArbitraryOutput[M]()), executor ) - command.run((key, lexRange.min.stringify, lexRange.max.stringify, limit)) + command.run((key, lexRange.min.asString, lexRange.max.asString, limit)) } } @@ -631,7 +631,7 @@ trait SortedSets extends RedisEnvironment { ChunkOutput(ArbitraryOutput[M]()), executor ) - command.run((key, scoreRange.min.stringify, scoreRange.max.stringify, limit)) + command.run((key, scoreRange.min.asString, scoreRange.max.asString, limit)) } } @@ -668,7 +668,7 @@ trait SortedSets extends RedisEnvironment { .map(_.map { case (m, s) => MemberScore(s, m) }), executor ) - command.run((key, scoreRange.min.stringify, scoreRange.max.stringify, WithScores.stringify, limit)) + command.run((key, scoreRange.min.asString, scoreRange.max.asString, WithScores.asString, limit)) } } @@ -732,7 +732,7 @@ trait SortedSets extends RedisEnvironment { LongOutput, executor ) - command.run((key, lexRange.min.stringify, lexRange.max.stringify)) + command.run((key, lexRange.min.asString, lexRange.max.asString)) } /** @@ -767,7 +767,7 @@ trait SortedSets extends RedisEnvironment { LongOutput, executor ) - command.run((key, scoreRange.min.stringify, scoreRange.max.stringify)) + command.run((key, scoreRange.min.asString, scoreRange.max.asString)) } /** @@ -816,7 +816,7 @@ trait SortedSets extends RedisEnvironment { .map(_.map { case (m, s) => MemberScore(s, m) }), executor ) - command.run((key, range, WithScores.stringify)) + command.run((key, range, WithScores.asString)) } } @@ -851,7 +851,7 @@ trait SortedSets extends RedisEnvironment { ChunkOutput(ArbitraryOutput[M]()), executor ) - command.run((key, lexRange.max.stringify, lexRange.min.stringify, limit)) + command.run((key, lexRange.max.asString, lexRange.min.asString, limit)) } } @@ -886,7 +886,7 @@ trait SortedSets extends RedisEnvironment { ChunkOutput(ArbitraryOutput[M]()), executor ) - command.run((key, scoreRange.max.stringify, scoreRange.min.stringify, limit)) + command.run((key, scoreRange.max.asString, scoreRange.min.asString, limit)) } } @@ -923,7 +923,7 @@ trait SortedSets extends RedisEnvironment { .map(_.map { case (m, s) => MemberScore(s, m) }), executor ) - command.run((key, scoreRange.max.stringify, scoreRange.min.stringify, WithScores.stringify, limit)) + command.run((key, scoreRange.max.asString, scoreRange.min.asString, WithScores.asString, limit)) } } @@ -1079,7 +1079,7 @@ trait SortedSets extends RedisEnvironment { .map(_.map { case (m, s) => MemberScore(s, m) }), executor ) - command.run((inputKeysNum, (key, keys.toList), weights, aggregate, WithScores.stringify)) + command.run((inputKeysNum, (key, keys.toList), weights, aggregate, WithScores.asString)) } } @@ -1207,7 +1207,7 @@ trait SortedSets extends RedisEnvironment { executor ) - command.run((key, count, WithScores.stringify)) + command.run((key, count, WithScores.asString)) } } } diff --git a/redis/src/main/scala/zio/redis/api/Strings.scala b/redis/src/main/scala/zio/redis/api/Strings.scala index dd4db2761..0f1299ec9 100644 --- a/redis/src/main/scala/zio/redis/api/Strings.scala +++ b/redis/src/main/scala/zio/redis/api/Strings.scala @@ -603,7 +603,7 @@ trait Strings extends RedisEnvironment { StrAlgoLcsOutput, executor ) - redisCommand.run((command.stringify, keyA, keyB, lcsQueryType)) + redisCommand.run((command.asString, keyA, keyB, lcsQueryType)) } } diff --git a/redis/src/main/scala/zio/redis/options/Cluster.scala b/redis/src/main/scala/zio/redis/options/Cluster.scala index d73606ad0..c7b6d21a2 100644 --- a/redis/src/main/scala/zio/redis/options/Cluster.scala +++ b/redis/src/main/scala/zio/redis/options/Cluster.scala @@ -54,7 +54,7 @@ object Cluster { } sealed trait SetSlotSubCommand extends Product { self => - private[redis] final def stringify: String = + private[redis] final def asString: String = self match { case SetSlotSubCommand.Migrating => "MIGRATING" case SetSlotSubCommand.Importing => "IMPORTING" diff --git a/redis/src/main/scala/zio/redis/options/Connection.scala b/redis/src/main/scala/zio/redis/options/Connection.scala index fdba8bf53..ecb2bd74d 100644 --- a/redis/src/main/scala/zio/redis/options/Connection.scala +++ b/redis/src/main/scala/zio/redis/options/Connection.scala @@ -22,7 +22,7 @@ import java.net.InetAddress trait Connection { sealed case class Address(ip: InetAddress, port: Int) { - private[redis] final def stringify: String = s"${ip.getHostAddress}:$port" + private[redis] final def asString: String = s"${ip.getHostAddress}:$port" } sealed case class ClientEvents(readable: Boolean = false, writable: Boolean = false) @@ -91,10 +91,10 @@ trait Connection { object ClientKillFilter { sealed case class Address(ip: InetAddress, port: Int) extends ClientKillFilter { - private[redis] final def stringify: String = s"${ip.getHostAddress}:$port" + private[redis] final def asString: String = s"${ip.getHostAddress}:$port" } sealed case class LocalAddress(ip: InetAddress, port: Int) extends ClientKillFilter { - private[redis] final def stringify: String = s"${ip.getHostAddress}:$port" + private[redis] final def asString: String = s"${ip.getHostAddress}:$port" } sealed case class Id(id: Long) extends ClientKillFilter sealed case class Type(clientType: ClientType) extends ClientKillFilter @@ -103,7 +103,7 @@ trait Connection { } sealed trait ClientPauseMode { self => - private[redis] final def stringify: String = + private[redis] final def asString: String = self match { case ClientPauseMode.All => "ALL" case ClientPauseMode.Write => "WRITE" @@ -130,7 +130,7 @@ trait Connection { ) sealed trait ClientTrackingMode { self => - private[redis] final def stringify: String = + private[redis] final def asString: String = self match { case ClientTrackingMode.OptIn => "OPTIN" case ClientTrackingMode.OptOut => "OPTOUT" @@ -154,7 +154,7 @@ trait Connection { } sealed trait ClientType { self => - private[redis] final def stringify: String = + private[redis] final def asString: String = self match { case ClientType.Normal => "normal" case ClientType.Master => "master" @@ -171,7 +171,7 @@ trait Connection { } sealed trait UnblockBehavior { self => - private[redis] final def stringify: String = + private[redis] final def asString: String = self match { case UnblockBehavior.Timeout => "TIMEOUT" case UnblockBehavior.Error => "ERROR" diff --git a/redis/src/main/scala/zio/redis/options/Geo.scala b/redis/src/main/scala/zio/redis/options/Geo.scala index f05a29edb..d283164d0 100644 --- a/redis/src/main/scala/zio/redis/options/Geo.scala +++ b/redis/src/main/scala/zio/redis/options/Geo.scala @@ -24,7 +24,7 @@ trait Geo { sealed case class GeoView(member: String, dist: Option[Double], hash: Option[Long], longLat: Option[LongLat]) sealed trait RadiusUnit { self => - private[redis] final def stringify: String = + private[redis] final def asString: String = self match { case RadiusUnit.Meters => "m" case RadiusUnit.Kilometers => "km" @@ -60,19 +60,19 @@ trait Geo { sealed case class StoreDist(key: String) case object WithCoord { - private[redis] def stringify: String = "WITHCOORD" + private[redis] def asString: String = "WITHCOORD" } type WithCoord = WithCoord.type case object WithDist { - private[redis] def stringify: String = "WITHDIST" + private[redis] def asString: String = "WITHDIST" } type WithDist = WithDist.type case object WithHash { - private[redis] def stringify: String = "WITHHASH" + private[redis] def asString: String = "WITHHASH" } type WithHash = WithHash.type diff --git a/redis/src/main/scala/zio/redis/options/Keys.scala b/redis/src/main/scala/zio/redis/options/Keys.scala index 77b6f270c..b1e21ddf1 100644 --- a/redis/src/main/scala/zio/redis/options/Keys.scala +++ b/redis/src/main/scala/zio/redis/options/Keys.scala @@ -19,13 +19,13 @@ package zio.redis.options trait Keys { case object AbsTtl { - private[redis] def stringify: String = "ABSTTL" + private[redis] def asString: String = "ABSTTL" } type AbsTtl = AbsTtl.type case object Alpha { - private[redis] def stringify: String = "ALPHA" + private[redis] def asString: String = "ALPHA" } type Alpha = Alpha.type @@ -33,7 +33,7 @@ trait Keys { sealed case class Auth(username: Option[String], password: String) case object Copy { - private[redis] def stringify: String = "COPY" + private[redis] def asString: String = "COPY" } type Copy = Copy.type @@ -43,7 +43,7 @@ trait Keys { sealed case class Freq(frequency: String) sealed trait RedisType extends Product with Serializable { self => - private[redis] final def stringify: String = + private[redis] final def asString: String = self match { case RedisType.String => "string" case RedisType.List => "list" @@ -64,7 +64,7 @@ trait Keys { } case object Replace { - private[redis] def stringify: String = "REPLACE" + private[redis] def asString: String = "REPLACE" } type Replace = Replace.type diff --git a/redis/src/main/scala/zio/redis/options/Lists.scala b/redis/src/main/scala/zio/redis/options/Lists.scala index d9de5cd1e..af2052699 100644 --- a/redis/src/main/scala/zio/redis/options/Lists.scala +++ b/redis/src/main/scala/zio/redis/options/Lists.scala @@ -18,7 +18,7 @@ package zio.redis.options trait Lists { sealed trait Position { self => - private[redis] final def stringify: String = + private[redis] final def asString: String = self match { case Position.Before => "BEFORE" case Position.After => "AFTER" @@ -31,7 +31,7 @@ trait Lists { } sealed trait Side { self => - private[redis] final def stringify: String = + private[redis] final def asString: String = self match { case Side.Left => "LEFT" case Side.Right => "RIGHT" diff --git a/redis/src/main/scala/zio/redis/options/Scripting.scala b/redis/src/main/scala/zio/redis/options/Scripting.scala index 8255287dc..74df580e4 100644 --- a/redis/src/main/scala/zio/redis/options/Scripting.scala +++ b/redis/src/main/scala/zio/redis/options/Scripting.scala @@ -18,7 +18,7 @@ package zio.redis.options trait Scripting { sealed trait DebugMode { self => - private[redis] final def stringify: String = + private[redis] final def asString: String = self match { case DebugMode.Yes => "YES" case DebugMode.Sync => "SYNC" @@ -33,7 +33,7 @@ trait Scripting { } sealed trait FlushMode { self => - private[redis] final def stringify: String = + private[redis] final def asString: String = self match { case FlushMode.Async => "ASYNC" case FlushMode.Sync => "SYNC" diff --git a/redis/src/main/scala/zio/redis/options/Shared.scala b/redis/src/main/scala/zio/redis/options/Shared.scala index f2d054195..ba68f8559 100644 --- a/redis/src/main/scala/zio/redis/options/Shared.scala +++ b/redis/src/main/scala/zio/redis/options/Shared.scala @@ -19,7 +19,7 @@ package zio.redis.options trait Shared { sealed trait Update { self => - private[redis] final def stringify: String = + private[redis] final def asString: String = self match { case Update.SetExisting => "XX" case Update.SetNew => "NX" @@ -38,7 +38,7 @@ trait Shared { sealed case class Count(count: Long) sealed trait Order { self => - private[redis] final def stringify: String = + private[redis] final def asString: String = self match { case Order.Ascending => "ASC" case Order.Descending => "DESC" diff --git a/redis/src/main/scala/zio/redis/options/SortedSets.scala b/redis/src/main/scala/zio/redis/options/SortedSets.scala index 545c19c55..0aa7f2464 100644 --- a/redis/src/main/scala/zio/redis/options/SortedSets.scala +++ b/redis/src/main/scala/zio/redis/options/SortedSets.scala @@ -20,7 +20,7 @@ import zio.Chunk trait SortedSets { sealed trait Aggregate extends Product { self => - private[redis] final def stringify: String = + private[redis] final def asString: String = self match { case Aggregate.Max => "MAX" case Aggregate.Min => "MIN" @@ -35,19 +35,19 @@ trait SortedSets { } case object Changed { - private[redis] def stringify: String = "CH" + private[redis] def asString: String = "CH" } type Changed = Changed.type case object Increment { - private[redis] def stringify: String = "INCR" + private[redis] def asString: String = "INCR" } type Increment = Increment.type sealed trait LexMaximum { self => - private[redis] final def stringify: String = + private[redis] final def asString: String = self match { case LexMaximum.Unbounded => "+" case LexMaximum.Open(value) => s"($value" @@ -62,7 +62,7 @@ trait SortedSets { } sealed trait LexMinimum { self => - private[redis] final def stringify: String = + private[redis] final def asString: String = self match { case LexMinimum.Unbounded => "-" case LexMinimum.Open(value) => s"($value" @@ -83,7 +83,7 @@ trait SortedSets { type MemberScores[+M] = Chunk[MemberScore[M]] sealed trait ScoreMaximum { self => - private[redis] final def stringify: String = + private[redis] final def asString: String = self match { case ScoreMaximum.Infinity => "+inf" case ScoreMaximum.Open(value) => s"($value" @@ -98,7 +98,7 @@ trait SortedSets { } sealed trait ScoreMinimum { self => - private[redis] final def stringify: String = + private[redis] final def asString: String = self match { case ScoreMinimum.Infinity => "-inf" case ScoreMinimum.Open(value) => s"($value" @@ -115,7 +115,7 @@ trait SortedSets { sealed case class ScoreRange(min: ScoreMinimum, max: ScoreMaximum) case object WithScores { - private[redis] def stringify: String = "WITHSCORES" + private[redis] def asString: String = "WITHSCORES" } type WithScores = WithScores.type diff --git a/redis/src/main/scala/zio/redis/options/Streams.scala b/redis/src/main/scala/zio/redis/options/Streams.scala index 81e620131..502895d9d 100644 --- a/redis/src/main/scala/zio/redis/options/Streams.scala +++ b/redis/src/main/scala/zio/redis/options/Streams.scala @@ -21,13 +21,13 @@ import zio._ trait Streams { case object WithForce { - private[redis] def stringify = "FORCE" + private[redis] def asString = "FORCE" } type WithForce = WithForce.type case object WithJustId { - private[redis] def stringify = "JUSTID" + private[redis] def asString = "JUSTID" } type WithJustId = WithJustId.type @@ -43,7 +43,7 @@ trait Streams { } case object MkStream { - private[redis] def stringify = "MKSTREAM" + private[redis] def asString = "MKSTREAM" } type MkStream = MkStream.type @@ -65,7 +65,7 @@ trait Streams { sealed case class Group[G, C](group: G, consumer: C) case object NoAck { - private[redis] def stringify: String = "NOACK" + private[redis] def asString: String = "NOACK" } type NoAck = NoAck.type diff --git a/redis/src/main/scala/zio/redis/options/Strings.scala b/redis/src/main/scala/zio/redis/options/Strings.scala index 33933d82f..651ab4a68 100644 --- a/redis/src/main/scala/zio/redis/options/Strings.scala +++ b/redis/src/main/scala/zio/redis/options/Strings.scala @@ -20,7 +20,7 @@ trait Strings { sealed trait StrAlgoLCS { self => - private[redis] final def stringify: String = + private[redis] final def asString: String = self match { case StralgoLCS.Strings => "STRINGS" case StralgoLCS.Keys => "KEYS" @@ -60,7 +60,7 @@ trait Strings { sealed case class BitFieldIncr(`type`: BitFieldType, offset: Int, increment: Long) extends BitFieldCommand sealed trait BitFieldOverflow extends BitFieldCommand { self => - private[redis] final def stringify: String = + private[redis] final def asString: String = self match { case BitFieldOverflow.Fail => "FAIL" case BitFieldOverflow.Sat => "SAT" @@ -76,7 +76,7 @@ trait Strings { } sealed trait BitFieldType { self => - private[redis] final def stringify: String = + private[redis] final def asString: String = self match { case BitFieldType.UnsignedInt(size) => s"u$size" case BitFieldType.SignedInt(size) => s"i$size" @@ -89,7 +89,7 @@ trait Strings { } sealed trait BitOperation { self => - private[redis] final def stringify: String = + private[redis] final def asString: String = self match { case BitOperation.AND => "AND" case BitOperation.OR => "OR" @@ -108,13 +108,13 @@ trait Strings { sealed case class BitPosRange(start: Long, end: Option[Long]) case object KeepTtl { - private[redis] def stringify: String = "KEEPTTL" + private[redis] def asString: String = "KEEPTTL" } type KeepTtl = KeepTtl.type sealed trait Expire { self => - private[redis] final def stringify: String = + private[redis] final def asString: String = self match { case Expire.SetExpireSeconds => "EX" case Expire.SetExpireMilliseconds => "PX" @@ -126,7 +126,7 @@ trait Strings { } sealed trait ExpiredAt { self => - private[redis] final def stringify: String = + private[redis] final def asString: String = self match { case ExpiredAt.SetExpireAtSeconds => "EXAT" case ExpiredAt.SetExpireAtMilliseconds => "PXAT" diff --git a/redis/src/test/scala/zio/redis/InputSpec.scala b/redis/src/test/scala/zio/redis/InputSpec.scala index 00e44c670..dd6b77f09 100644 --- a/redis/src/test/scala/zio/redis/InputSpec.scala +++ b/redis/src/test/scala/zio/redis/InputSpec.scala @@ -480,7 +480,7 @@ object InputSpec extends BaseSpec { for { result <- ZIO.attempt( Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]()) - .encode((LexMinimum.Unbounded.stringify, LexMaximum.Unbounded.stringify)) + .encode((LexMinimum.Unbounded.asString, LexMaximum.Unbounded.asString)) ) } yield assert(result)(equalTo(RespCommand(Value("-"), Value("+")))) }, @@ -488,7 +488,7 @@ object InputSpec extends BaseSpec { for { result <- ZIO.attempt( Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]()) - .encode((LexMinimum.Open("a").stringify, LexMaximum.Unbounded.stringify)) + .encode((LexMinimum.Open("a").asString, LexMaximum.Unbounded.asString)) ) } yield assert(result)(equalTo(RespCommand(Value("(a"), Value("+")))) }, @@ -496,7 +496,7 @@ object InputSpec extends BaseSpec { for { result <- ZIO.attempt( Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]()) - .encode((LexMinimum.Closed("a").stringify, LexMaximum.Unbounded.stringify)) + .encode((LexMinimum.Closed("a").asString, LexMaximum.Unbounded.asString)) ) } yield assert(result)(equalTo(RespCommand(Value("[a"), Value("+")))) }, @@ -504,7 +504,7 @@ object InputSpec extends BaseSpec { for { result <- ZIO.attempt( Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]()) - .encode((LexMinimum.Unbounded.stringify, LexMaximum.Open("z").stringify)) + .encode((LexMinimum.Unbounded.asString, LexMaximum.Open("z").asString)) ) } yield assert(result)(equalTo(RespCommand(Value("-"), Value("(z")))) }, @@ -512,7 +512,7 @@ object InputSpec extends BaseSpec { for { result <- ZIO.attempt( Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]()) - .encode((LexMinimum.Open("a").stringify, LexMaximum.Open("z").stringify)) + .encode((LexMinimum.Open("a").asString, LexMaximum.Open("z").asString)) ) } yield assert(result)(equalTo(RespCommand(Value("(a"), Value("(z")))) }, @@ -520,7 +520,7 @@ object InputSpec extends BaseSpec { for { result <- ZIO.attempt( Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]()) - .encode((LexMinimum.Closed("a").stringify, LexMaximum.Open("z").stringify)) + .encode((LexMinimum.Closed("a").asString, LexMaximum.Open("z").asString)) ) } yield assert(result)(equalTo(RespCommand(Value("[a"), Value("(z")))) }, @@ -528,7 +528,7 @@ object InputSpec extends BaseSpec { for { result <- ZIO.attempt( Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]()) - .encode((LexMinimum.Unbounded.stringify, LexMaximum.Closed("z").stringify)) + .encode((LexMinimum.Unbounded.asString, LexMaximum.Closed("z").asString)) ) } yield assert(result)(equalTo(RespCommand(Value("-"), Value("[z")))) }, @@ -536,7 +536,7 @@ object InputSpec extends BaseSpec { for { result <- ZIO.attempt( Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]()) - .encode((LexMinimum.Open("a").stringify, LexMaximum.Closed("z").stringify)) + .encode((LexMinimum.Open("a").asString, LexMaximum.Closed("z").asString)) ) } yield assert(result)(equalTo(RespCommand(Value("(a"), Value("[z")))) }, @@ -544,7 +544,7 @@ object InputSpec extends BaseSpec { for { result <- ZIO.attempt( Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]()) - .encode((LexMinimum.Closed("a").stringify, LexMaximum.Closed("z").stringify)) + .encode((LexMinimum.Closed("a").asString, LexMaximum.Closed("z").asString)) ) } yield assert(result)(equalTo(RespCommand(Value("[a"), Value("[z")))) } @@ -755,7 +755,7 @@ object InputSpec extends BaseSpec { for { result <- ZIO.attempt( Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]()) - .encode((ScoreMinimum.Infinity.stringify, ScoreMaximum.Infinity.stringify)) + .encode((ScoreMinimum.Infinity.asString, ScoreMaximum.Infinity.asString)) ) } yield assert(result)(equalTo(RespCommand(Value("-inf"), Value("+inf")))) }, @@ -763,7 +763,7 @@ object InputSpec extends BaseSpec { for { result <- ZIO.attempt( Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]()) - .encode((ScoreMinimum.Open(4.2d).stringify, ScoreMaximum.Infinity.stringify)) + .encode((ScoreMinimum.Open(4.2d).asString, ScoreMaximum.Infinity.asString)) ) } yield assert(result)(equalTo(RespCommand(Value("(4.2"), Value("+inf")))) }, @@ -771,7 +771,7 @@ object InputSpec extends BaseSpec { for { result <- ZIO.attempt( Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]()) - .encode((ScoreMinimum.Closed(4.2d).stringify, ScoreMaximum.Infinity.stringify)) + .encode((ScoreMinimum.Closed(4.2d).asString, ScoreMaximum.Infinity.asString)) ) } yield assert(result)(equalTo(RespCommand(Value("4.2"), Value("+inf")))) }, @@ -779,7 +779,7 @@ object InputSpec extends BaseSpec { for { result <- ZIO.attempt( Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]()) - .encode((ScoreMinimum.Infinity.stringify, ScoreMaximum.Open(5.2d).stringify)) + .encode((ScoreMinimum.Infinity.asString, ScoreMaximum.Open(5.2d).asString)) ) } yield assert(result)(equalTo(RespCommand(Value("-inf"), Value("(5.2")))) }, @@ -787,7 +787,7 @@ object InputSpec extends BaseSpec { for { result <- ZIO.attempt( Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]()) - .encode((ScoreMinimum.Open(4.2d).stringify, ScoreMaximum.Open(5.2d).stringify)) + .encode((ScoreMinimum.Open(4.2d).asString, ScoreMaximum.Open(5.2d).asString)) ) } yield assert(result)(equalTo(RespCommand(Value("(4.2"), Value("(5.2")))) }, @@ -795,7 +795,7 @@ object InputSpec extends BaseSpec { for { result <- ZIO.attempt( Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]()) - .encode((ScoreMinimum.Closed(4.2d).stringify, ScoreMaximum.Open(5.2d).stringify)) + .encode((ScoreMinimum.Closed(4.2d).asString, ScoreMaximum.Open(5.2d).asString)) ) } yield assert(result)(equalTo(RespCommand(Value("4.2"), Value("(5.2")))) }, @@ -803,7 +803,7 @@ object InputSpec extends BaseSpec { for { result <- ZIO.attempt( Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]()) - .encode((ScoreMinimum.Infinity.stringify, ScoreMaximum.Closed(5.2d).stringify)) + .encode((ScoreMinimum.Infinity.asString, ScoreMaximum.Closed(5.2d).asString)) ) } yield assert(result)(equalTo(RespCommand(Value("-inf"), Value("5.2")))) }, @@ -811,7 +811,7 @@ object InputSpec extends BaseSpec { for { result <- ZIO.attempt( Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]()) - .encode((ScoreMinimum.Open(4.2d).stringify, ScoreMaximum.Closed(5.2d).stringify)) + .encode((ScoreMinimum.Open(4.2d).asString, ScoreMaximum.Closed(5.2d).asString)) ) } yield assert(result)(equalTo(RespCommand(Value("(4.2"), Value("5.2")))) }, @@ -819,7 +819,7 @@ object InputSpec extends BaseSpec { for { result <- ZIO.attempt( Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]()) - .encode((ScoreMinimum.Closed(4.2d).stringify, ScoreMaximum.Closed(5.2d).stringify)) + .encode((ScoreMinimum.Closed(4.2d).asString, ScoreMaximum.Closed(5.2d).asString)) ) } yield assert(result)(equalTo(RespCommand(Value("4.2"), Value("5.2")))) } From 8c16752e357e004ed36684208d425aec3264232d Mon Sep 17 00:00:00 2001 From: Dejan Mijic Date: Wed, 29 Mar 2023 11:28:37 +0200 Subject: [PATCH 12/19] Create zio.redis.internal --- .../main/scala/zio/redis/ClusterExecutor.scala | 1 + redis/src/main/scala/zio/redis/Input.scala | 9 +++++---- redis/src/main/scala/zio/redis/Output.scala | 7 ++++--- .../src/main/scala/zio/redis/RedisExecutor.scala | 2 +- .../src/main/scala/zio/redis/ResultBuilder.scala | 5 ++--- .../main/scala/zio/redis/SingleNodeExecutor.scala | 2 +- redis/src/main/scala/zio/redis/api/Cluster.scala | 1 + .../src/main/scala/zio/redis/api/Connection.scala | 1 + redis/src/main/scala/zio/redis/api/Geo.scala | 1 + redis/src/main/scala/zio/redis/api/Hashes.scala | 1 + .../main/scala/zio/redis/api/HyperLogLog.scala | 3 ++- redis/src/main/scala/zio/redis/api/Keys.scala | 1 + redis/src/main/scala/zio/redis/api/Lists.scala | 1 + .../src/main/scala/zio/redis/api/Scripting.scala | 6 +++--- redis/src/main/scala/zio/redis/api/Sets.scala | 1 + .../src/main/scala/zio/redis/api/SortedSets.scala | 1 + redis/src/main/scala/zio/redis/api/Streams.scala | 1 + redis/src/main/scala/zio/redis/api/Strings.scala | 1 + .../scala/zio/redis/{ => internal}/CRC16.scala | 2 +- .../zio/redis/{ => internal}/RedisCommand.scala | 4 +++- .../redis/{ => internal}/RedisConnection.scala | 3 ++- .../redis/{ => internal}/RedisEnvironment.scala | 3 ++- .../zio/redis/{ => internal}/RespCommand.scala | 2 +- .../{ => internal}/RespCommandArgument.scala | 15 +++++++-------- .../zio/redis/{ => internal}/RespValue.scala | 3 ++- .../scala/zio/redis/ClusterExecutorSpec.scala | 2 +- redis/src/test/scala/zio/redis/InputSpec.scala | 3 ++- redis/src/test/scala/zio/redis/OutputSpec.scala | 2 +- .../src/test/scala/zio/redis/ScriptingSpec.scala | 3 ++- .../zio/redis/{ => internal}/CRC16Spec.scala | 4 +++- .../{ => internal}/RedisConnectionSpec.scala | 4 +++- .../{ => internal}/RespCommandArgumentSpec.scala | 4 +++- .../zio/redis/{ => internal}/RespValueSpec.scala | 4 +++- 33 files changed, 65 insertions(+), 38 deletions(-) rename redis/src/main/scala/zio/redis/{ => internal}/CRC16.scala (99%) rename redis/src/main/scala/zio/redis/{ => internal}/RedisCommand.scala (94%) rename redis/src/main/scala/zio/redis/{ => internal}/RedisConnection.scala (98%) rename redis/src/main/scala/zio/redis/{ => internal}/RedisEnvironment.scala (92%) rename redis/src/main/scala/zio/redis/{ => internal}/RespCommand.scala (97%) rename redis/src/main/scala/zio/redis/{ => internal}/RespCommandArgument.scala (82%) rename redis/src/main/scala/zio/redis/{ => internal}/RespValue.scala (99%) rename redis/src/test/scala/zio/redis/{ => internal}/CRC16Spec.scala (89%) rename redis/src/test/scala/zio/redis/{ => internal}/RedisConnectionSpec.scala (88%) rename redis/src/test/scala/zio/redis/{ => internal}/RespCommandArgumentSpec.scala (87%) rename redis/src/test/scala/zio/redis/{ => internal}/RespValueSpec.scala (94%) diff --git a/redis/src/main/scala/zio/redis/ClusterExecutor.scala b/redis/src/main/scala/zio/redis/ClusterExecutor.scala index b1aff93ee..b3b8329d6 100644 --- a/redis/src/main/scala/zio/redis/ClusterExecutor.scala +++ b/redis/src/main/scala/zio/redis/ClusterExecutor.scala @@ -19,6 +19,7 @@ package zio.redis import zio._ import zio.redis.ClusterExecutor._ import zio.redis.api.Cluster.AskingCommand +import zio.redis.internal.{RedisConnection, RespCommand, RespCommandArgument, RespValue} import zio.redis.options.Cluster._ import java.io.IOException diff --git a/redis/src/main/scala/zio/redis/Input.scala b/redis/src/main/scala/zio/redis/Input.scala index f12bf5b55..5a94e7e0f 100644 --- a/redis/src/main/scala/zio/redis/Input.scala +++ b/redis/src/main/scala/zio/redis/Input.scala @@ -17,13 +17,15 @@ package zio.redis import zio._ +import zio.redis._ +import zio.redis.internal.{RespCommand, RespCommandArgument} import zio.schema.codec.BinaryCodec import java.time.Instant import java.util.concurrent.TimeUnit -private[redis] sealed trait Input[-A] { self => - def encode(data: A): RespCommand +sealed trait Input[-A] { self => + private[redis] def encode(data: A): RespCommand final def contramap[B](f: B => A): Input[B] = new Input[B] { @@ -31,8 +33,7 @@ private[redis] sealed trait Input[-A] { self => } } -private[redis] object Input { - +object Input { def apply[A](implicit input: Input[A]): Input[A] = input case object AbsTtlInput extends Input[AbsTtl] { diff --git a/redis/src/main/scala/zio/redis/Output.scala b/redis/src/main/scala/zio/redis/Output.scala index c779202b8..d039d2eca 100644 --- a/redis/src/main/scala/zio/redis/Output.scala +++ b/redis/src/main/scala/zio/redis/Output.scala @@ -17,11 +17,12 @@ package zio.redis import zio._ +import zio.redis.internal.RespValue import zio.redis.options.Cluster.{Node, Partition, SlotRange} import zio.schema.Schema import zio.schema.codec.BinaryCodec -private[redis] sealed trait Output[+A] { self => +sealed trait Output[+A] { self => protected def tryDecode(respValue: RespValue): A final def map[B](f: A => B): Output[B] = @@ -29,14 +30,14 @@ private[redis] sealed trait Output[+A] { self => protected def tryDecode(respValue: RespValue): B = f(self.tryDecode(respValue)) } - final def unsafeDecode(respValue: RespValue): A = + private[redis] final def unsafeDecode(respValue: RespValue): A = respValue match { case error: RespValue.Error => throw error.toRedisError case success => tryDecode(success) } } -private[redis] object Output { +object Output { import RedisError._ def apply[A](implicit output: Output[A]): Output[A] = output diff --git a/redis/src/main/scala/zio/redis/RedisExecutor.scala b/redis/src/main/scala/zio/redis/RedisExecutor.scala index 2daeb9887..b7d5306f2 100644 --- a/redis/src/main/scala/zio/redis/RedisExecutor.scala +++ b/redis/src/main/scala/zio/redis/RedisExecutor.scala @@ -17,7 +17,7 @@ package zio.redis import zio.IO - +import zio.redis.internal.{RespCommand, RespValue} trait RedisExecutor { private[redis] def execute(command: RespCommand): IO[RedisError, RespValue] } diff --git a/redis/src/main/scala/zio/redis/ResultBuilder.scala b/redis/src/main/scala/zio/redis/ResultBuilder.scala index 400a6c8b1..f04dbf245 100644 --- a/redis/src/main/scala/zio/redis/ResultBuilder.scala +++ b/redis/src/main/scala/zio/redis/ResultBuilder.scala @@ -20,13 +20,13 @@ import zio.IO import zio.redis.ResultBuilder.NeedsReturnType import zio.schema.Schema -private[redis] sealed trait ResultBuilder { +sealed trait ResultBuilder { final def map(f: Nothing => Any)(implicit nrt: NeedsReturnType): IO[Nothing, Nothing] = ??? final def flatMap(f: Nothing => Any)(implicit nrt: NeedsReturnType): IO[Nothing, Nothing] = ??? } -private[redis] object ResultBuilder { +object ResultBuilder { @annotation.implicitNotFound("Use `returning[A]` to specify method's return type") final abstract class NeedsReturnType @@ -42,7 +42,6 @@ private[redis] object ResultBuilder { def returning[R1: Schema, R2: Schema, R3: Schema]: IO[RedisError, F[R1, R2, R3]] } - @annotation.nowarn trait ResultOutputBuilder extends ResultBuilder { def returning[R: Output]: IO[RedisError, R] } diff --git a/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala b/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala index 1cd267d6f..e9dbaea70 100644 --- a/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala +++ b/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala @@ -18,7 +18,7 @@ package zio.redis import zio._ import zio.redis.SingleNodeExecutor._ - +import zio.redis.internal.{RedisConnection, RespCommand, RespValue} final class SingleNodeExecutor( reqQueue: Queue[Request], resQueue: Queue[Promise[RedisError, RespValue]], diff --git a/redis/src/main/scala/zio/redis/api/Cluster.scala b/redis/src/main/scala/zio/redis/api/Cluster.scala index 19672269c..917433a90 100644 --- a/redis/src/main/scala/zio/redis/api/Cluster.scala +++ b/redis/src/main/scala/zio/redis/api/Cluster.scala @@ -20,6 +20,7 @@ import zio.redis.Input._ import zio.redis.Output.{ChunkOutput, ClusterPartitionOutput, UnitOutput} import zio.redis._ import zio.redis.api.Cluster.{AskingCommand, ClusterSetSlots, ClusterSlots} +import zio.redis.internal.{RedisCommand, RedisEnvironment} import zio.redis.options.Cluster.SetSlotSubCommand._ import zio.redis.options.Cluster.{Partition, Slot} import zio.{Chunk, IO} diff --git a/redis/src/main/scala/zio/redis/api/Connection.scala b/redis/src/main/scala/zio/redis/api/Connection.scala index 186e9865a..3a6850b28 100644 --- a/redis/src/main/scala/zio/redis/api/Connection.scala +++ b/redis/src/main/scala/zio/redis/api/Connection.scala @@ -20,6 +20,7 @@ import zio._ import zio.redis.Input._ import zio.redis.Output._ import zio.redis._ +import zio.redis.internal.{RedisCommand, RedisEnvironment} trait Connection extends RedisEnvironment { import Connection.{Auth => _, _} diff --git a/redis/src/main/scala/zio/redis/api/Geo.scala b/redis/src/main/scala/zio/redis/api/Geo.scala index c159f1b89..83f561215 100644 --- a/redis/src/main/scala/zio/redis/api/Geo.scala +++ b/redis/src/main/scala/zio/redis/api/Geo.scala @@ -20,6 +20,7 @@ import zio._ import zio.redis.Input._ import zio.redis.Output._ import zio.redis._ +import zio.redis.internal.{RedisCommand, RedisEnvironment} import zio.schema.Schema trait Geo extends RedisEnvironment { diff --git a/redis/src/main/scala/zio/redis/api/Hashes.scala b/redis/src/main/scala/zio/redis/api/Hashes.scala index c3cd3a9f0..5538c75a4 100644 --- a/redis/src/main/scala/zio/redis/api/Hashes.scala +++ b/redis/src/main/scala/zio/redis/api/Hashes.scala @@ -21,6 +21,7 @@ import zio.redis.Input._ import zio.redis.Output._ import zio.redis.ResultBuilder._ import zio.redis._ +import zio.redis.internal.{RedisCommand, RedisEnvironment} import zio.schema.Schema trait Hashes extends RedisEnvironment { diff --git a/redis/src/main/scala/zio/redis/api/HyperLogLog.scala b/redis/src/main/scala/zio/redis/api/HyperLogLog.scala index 8c0f91ff2..6a5b42479 100644 --- a/redis/src/main/scala/zio/redis/api/HyperLogLog.scala +++ b/redis/src/main/scala/zio/redis/api/HyperLogLog.scala @@ -17,13 +17,14 @@ package zio.redis.api import zio.IO -import zio.redis.Input._ import zio.redis.Output._ import zio.redis._ +import zio.redis.internal.{RedisCommand, RedisEnvironment} import zio.schema.Schema trait HyperLogLog extends RedisEnvironment { import HyperLogLog._ + import Input._ /** * Adds the specified elements to the specified HyperLogLog. diff --git a/redis/src/main/scala/zio/redis/api/Keys.scala b/redis/src/main/scala/zio/redis/api/Keys.scala index d76fcbe65..3a263272e 100644 --- a/redis/src/main/scala/zio/redis/api/Keys.scala +++ b/redis/src/main/scala/zio/redis/api/Keys.scala @@ -21,6 +21,7 @@ import zio.redis.Input._ import zio.redis.Output._ import zio.redis.ResultBuilder._ import zio.redis._ +import zio.redis.internal.{RedisCommand, RedisEnvironment} import zio.schema.Schema import java.time.Instant diff --git a/redis/src/main/scala/zio/redis/api/Lists.scala b/redis/src/main/scala/zio/redis/api/Lists.scala index 614988744..49d32908e 100644 --- a/redis/src/main/scala/zio/redis/api/Lists.scala +++ b/redis/src/main/scala/zio/redis/api/Lists.scala @@ -21,6 +21,7 @@ import zio.redis.Input._ import zio.redis.Output._ import zio.redis.ResultBuilder._ import zio.redis._ +import zio.redis.internal.{RedisCommand, RedisEnvironment} import zio.schema.Schema trait Lists extends RedisEnvironment { diff --git a/redis/src/main/scala/zio/redis/api/Scripting.scala b/redis/src/main/scala/zio/redis/api/Scripting.scala index a0e339b8c..a2ec38035 100644 --- a/redis/src/main/scala/zio/redis/api/Scripting.scala +++ b/redis/src/main/scala/zio/redis/api/Scripting.scala @@ -17,12 +17,12 @@ package zio.redis.api import zio._ -import zio.redis.Input._ import zio.redis.Output._ import zio.redis.ResultBuilder.ResultOutputBuilder -import zio.redis._ - +import zio.redis.internal.{RedisCommand, RedisEnvironment} +import zio.redis.{Input, _} trait Scripting extends RedisEnvironment { + import Input._ import Scripting._ /** diff --git a/redis/src/main/scala/zio/redis/api/Sets.scala b/redis/src/main/scala/zio/redis/api/Sets.scala index 1f3504973..6a4416339 100644 --- a/redis/src/main/scala/zio/redis/api/Sets.scala +++ b/redis/src/main/scala/zio/redis/api/Sets.scala @@ -21,6 +21,7 @@ import zio.redis.Input._ import zio.redis.Output._ import zio.redis.ResultBuilder._ import zio.redis._ +import zio.redis.internal.{RedisCommand, RedisEnvironment} import zio.schema.Schema trait Sets extends RedisEnvironment { diff --git a/redis/src/main/scala/zio/redis/api/SortedSets.scala b/redis/src/main/scala/zio/redis/api/SortedSets.scala index de1016ae5..3c62cf408 100644 --- a/redis/src/main/scala/zio/redis/api/SortedSets.scala +++ b/redis/src/main/scala/zio/redis/api/SortedSets.scala @@ -21,6 +21,7 @@ import zio.redis.Input._ import zio.redis.Output._ import zio.redis.ResultBuilder._ import zio.redis._ +import zio.redis.internal.{RedisCommand, RedisEnvironment} import zio.schema.Schema trait SortedSets extends RedisEnvironment { diff --git a/redis/src/main/scala/zio/redis/api/Streams.scala b/redis/src/main/scala/zio/redis/api/Streams.scala index 878a52884..a9fbea423 100644 --- a/redis/src/main/scala/zio/redis/api/Streams.scala +++ b/redis/src/main/scala/zio/redis/api/Streams.scala @@ -21,6 +21,7 @@ import zio.redis.Input._ import zio.redis.Output._ import zio.redis.ResultBuilder._ import zio.redis._ +import zio.redis.internal.{RedisCommand, RedisEnvironment} import zio.schema.Schema trait Streams extends RedisEnvironment { diff --git a/redis/src/main/scala/zio/redis/api/Strings.scala b/redis/src/main/scala/zio/redis/api/Strings.scala index 0f1299ec9..41ed99ae0 100644 --- a/redis/src/main/scala/zio/redis/api/Strings.scala +++ b/redis/src/main/scala/zio/redis/api/Strings.scala @@ -21,6 +21,7 @@ import zio.redis.Input._ import zio.redis.Output._ import zio.redis.ResultBuilder._ import zio.redis._ +import zio.redis.internal.{RedisCommand, RedisEnvironment} import zio.schema.Schema import java.time.Instant diff --git a/redis/src/main/scala/zio/redis/CRC16.scala b/redis/src/main/scala/zio/redis/internal/CRC16.scala similarity index 99% rename from redis/src/main/scala/zio/redis/CRC16.scala rename to redis/src/main/scala/zio/redis/internal/CRC16.scala index 47a6b4668..76f7c2791 100644 --- a/redis/src/main/scala/zio/redis/CRC16.scala +++ b/redis/src/main/scala/zio/redis/internal/CRC16.scala @@ -14,7 +14,7 @@ * limitations under the License. */ -package zio.redis +package zio.redis.internal import zio.Chunk diff --git a/redis/src/main/scala/zio/redis/RedisCommand.scala b/redis/src/main/scala/zio/redis/internal/RedisCommand.scala similarity index 94% rename from redis/src/main/scala/zio/redis/RedisCommand.scala rename to redis/src/main/scala/zio/redis/internal/RedisCommand.scala index bc28804ff..24f80bdbd 100644 --- a/redis/src/main/scala/zio/redis/RedisCommand.scala +++ b/redis/src/main/scala/zio/redis/internal/RedisCommand.scala @@ -14,10 +14,12 @@ * limitations under the License. */ -package zio.redis +package zio.redis.internal import zio._ import zio.redis.Input.{CommandNameInput, Varargs} +import zio.redis._ +import zio.redis.internal.RespCommand private[redis] final class RedisCommand[-In, +Out] private ( val name: String, diff --git a/redis/src/main/scala/zio/redis/RedisConnection.scala b/redis/src/main/scala/zio/redis/internal/RedisConnection.scala similarity index 98% rename from redis/src/main/scala/zio/redis/RedisConnection.scala rename to redis/src/main/scala/zio/redis/internal/RedisConnection.scala index 1ab72b506..314de64ab 100644 --- a/redis/src/main/scala/zio/redis/RedisConnection.scala +++ b/redis/src/main/scala/zio/redis/internal/RedisConnection.scala @@ -14,9 +14,10 @@ * limitations under the License. */ -package zio.redis +package zio.redis.internal import zio._ +import zio.redis._ import zio.stream.{Stream, ZStream} import java.io.{EOFException, IOException} diff --git a/redis/src/main/scala/zio/redis/RedisEnvironment.scala b/redis/src/main/scala/zio/redis/internal/RedisEnvironment.scala similarity index 92% rename from redis/src/main/scala/zio/redis/RedisEnvironment.scala rename to redis/src/main/scala/zio/redis/internal/RedisEnvironment.scala index 10b38fe67..c52de87a7 100644 --- a/redis/src/main/scala/zio/redis/RedisEnvironment.scala +++ b/redis/src/main/scala/zio/redis/internal/RedisEnvironment.scala @@ -14,8 +14,9 @@ * limitations under the License. */ -package zio.redis +package zio.redis.internal +import zio.redis.{CodecSupplier, RedisExecutor} import zio.schema.Schema import zio.schema.codec.BinaryCodec diff --git a/redis/src/main/scala/zio/redis/RespCommand.scala b/redis/src/main/scala/zio/redis/internal/RespCommand.scala similarity index 97% rename from redis/src/main/scala/zio/redis/RespCommand.scala rename to redis/src/main/scala/zio/redis/internal/RespCommand.scala index daaa121af..82e3bf6b3 100644 --- a/redis/src/main/scala/zio/redis/RespCommand.scala +++ b/redis/src/main/scala/zio/redis/internal/RespCommand.scala @@ -14,7 +14,7 @@ * limitations under the License. */ -package zio.redis +package zio.redis.internal import zio.Chunk diff --git a/redis/src/main/scala/zio/redis/RespCommandArgument.scala b/redis/src/main/scala/zio/redis/internal/RespCommandArgument.scala similarity index 82% rename from redis/src/main/scala/zio/redis/RespCommandArgument.scala rename to redis/src/main/scala/zio/redis/internal/RespCommandArgument.scala index feec263d0..8ca9630ac 100644 --- a/redis/src/main/scala/zio/redis/RespCommandArgument.scala +++ b/redis/src/main/scala/zio/redis/internal/RespCommandArgument.scala @@ -14,14 +14,13 @@ * limitations under the License. */ -package zio.redis +package zio.redis.internal import zio.Chunk -import zio.redis.RespValue.BulkString +import zio.redis.internal.CRC16 import zio.schema.codec.BinaryCodec import java.nio.charset.StandardCharsets - private[redis] sealed trait RespCommandArgument { def value: RespValue.BulkString } @@ -29,7 +28,7 @@ private[redis] sealed trait RespCommandArgument { private[redis] object RespCommandArgument { final case class Unknown(bytes: Chunk[Byte]) extends RespCommandArgument { - lazy val value: BulkString = RespValue.BulkString(bytes) + lazy val value: RespValue.BulkString = RespValue.BulkString(bytes) } object Unknown { @@ -38,15 +37,15 @@ private[redis] object RespCommandArgument { } final case class CommandName(str: String) extends RespCommandArgument { - lazy val value: BulkString = RespValue.bulkString(str) + lazy val value: RespValue.BulkString = RespValue.bulkString(str) } final case class Literal(str: String) extends RespCommandArgument { - lazy val value: BulkString = RespValue.bulkString(str) + lazy val value: RespValue.BulkString = RespValue.bulkString(str) } final case class Key(bytes: Chunk[Byte]) extends RespCommandArgument { - lazy val value: BulkString = RespValue.BulkString(bytes) + lazy val value: RespValue.BulkString = RespValue.BulkString(bytes) lazy val asCRC16: Int = { val betweenBraces = bytes.dropWhile(b => b != '{').drop(1).takeWhile(b => b != '}') @@ -60,7 +59,7 @@ private[redis] object RespCommandArgument { } final case class Value(bytes: Chunk[Byte]) extends RespCommandArgument { - lazy val value: BulkString = RespValue.BulkString(bytes) + lazy val value: RespValue.BulkString = RespValue.BulkString(bytes) } object Value { diff --git a/redis/src/main/scala/zio/redis/RespValue.scala b/redis/src/main/scala/zio/redis/internal/RespValue.scala similarity index 99% rename from redis/src/main/scala/zio/redis/RespValue.scala rename to redis/src/main/scala/zio/redis/internal/RespValue.scala index 5f06bcf96..d34d62d8f 100644 --- a/redis/src/main/scala/zio/redis/RespValue.scala +++ b/redis/src/main/scala/zio/redis/internal/RespValue.scala @@ -14,10 +14,11 @@ * limitations under the License. */ -package zio.redis +package zio.redis.internal import zio._ import zio.redis.options.Cluster.Slot +import zio.redis.{RedisError, RedisUri} import zio.stream._ import java.nio.charset.StandardCharsets diff --git a/redis/src/test/scala/zio/redis/ClusterExecutorSpec.scala b/redis/src/test/scala/zio/redis/ClusterExecutorSpec.scala index e37bbb819..f27f115eb 100644 --- a/redis/src/test/scala/zio/redis/ClusterExecutorSpec.scala +++ b/redis/src/test/scala/zio/redis/ClusterExecutorSpec.scala @@ -1,9 +1,9 @@ package zio.redis +import zio.redis.internal.CRC16 import zio.redis.options.Cluster.{Slot, SlotsAmount} import zio.test._ import zio.{Chunk, Layer, ZIO, ZLayer, durationInt} - object ClusterExecutorSpec extends BaseSpec { def spec: Spec[TestEnvironment, Any] = suite("cluster executor")( diff --git a/redis/src/test/scala/zio/redis/InputSpec.scala b/redis/src/test/scala/zio/redis/InputSpec.scala index dd6b77f09..35c43bb87 100644 --- a/redis/src/test/scala/zio/redis/InputSpec.scala +++ b/redis/src/test/scala/zio/redis/InputSpec.scala @@ -2,7 +2,8 @@ package zio.redis import zio._ import zio.redis.Input._ -import zio.redis.RespCommandArgument._ +import zio.redis.internal.RespCommand +import zio.redis.internal.RespCommandArgument._ import zio.test.Assertion._ import zio.test._ diff --git a/redis/src/test/scala/zio/redis/OutputSpec.scala b/redis/src/test/scala/zio/redis/OutputSpec.scala index e305130cb..f9e6e9a43 100644 --- a/redis/src/test/scala/zio/redis/OutputSpec.scala +++ b/redis/src/test/scala/zio/redis/OutputSpec.scala @@ -3,9 +3,9 @@ package zio.redis import zio._ import zio.redis.Output._ import zio.redis.RedisError._ +import zio.redis.internal.RespValue import zio.test.Assertion._ import zio.test._ - object OutputSpec extends BaseSpec { def spec: Spec[Any, Throwable] = suite("Output decoders")( diff --git a/redis/src/test/scala/zio/redis/ScriptingSpec.scala b/redis/src/test/scala/zio/redis/ScriptingSpec.scala index 3d6f4f21f..7cae5ffe5 100644 --- a/redis/src/test/scala/zio/redis/ScriptingSpec.scala +++ b/redis/src/test/scala/zio/redis/ScriptingSpec.scala @@ -1,10 +1,11 @@ package zio.redis import zio._ -import zio.redis.Input.{BoolInput, LongInput, StringInput, ValueInput} +import zio.redis.Input._ import zio.redis.Output._ import zio.redis.RedisError._ import zio.redis.ScriptingSpec._ +import zio.redis.internal.RespValue import zio.test.Assertion._ import zio.test._ diff --git a/redis/src/test/scala/zio/redis/CRC16Spec.scala b/redis/src/test/scala/zio/redis/internal/CRC16Spec.scala similarity index 89% rename from redis/src/test/scala/zio/redis/CRC16Spec.scala rename to redis/src/test/scala/zio/redis/internal/CRC16Spec.scala index 89cb136eb..75a42bc5b 100644 --- a/redis/src/test/scala/zio/redis/CRC16Spec.scala +++ b/redis/src/test/scala/zio/redis/internal/CRC16Spec.scala @@ -1,10 +1,12 @@ -package zio.redis +package zio.redis.internal import zio.Chunk +import zio.redis._ import zio.test.Assertion._ import zio.test._ import java.nio.charset.StandardCharsets + object CRC16Spec extends BaseSpec { override def spec: Spec[Environment, Any] = suite("CRC16")( diff --git a/redis/src/test/scala/zio/redis/RedisConnectionSpec.scala b/redis/src/test/scala/zio/redis/internal/RedisConnectionSpec.scala similarity index 88% rename from redis/src/test/scala/zio/redis/RedisConnectionSpec.scala rename to redis/src/test/scala/zio/redis/internal/RedisConnectionSpec.scala index 2ac7b194e..8ecd34131 100644 --- a/redis/src/test/scala/zio/redis/RedisConnectionSpec.scala +++ b/redis/src/test/scala/zio/redis/internal/RedisConnectionSpec.scala @@ -1,5 +1,7 @@ -package zio.redis +package zio.redis.internal +import zio.redis._ +import zio.redis.internal.RedisConnection import zio.test.Assertion.{equalTo, isSome} import zio.test.{Spec, assert} import zio.{Chunk, ZIO} diff --git a/redis/src/test/scala/zio/redis/RespCommandArgumentSpec.scala b/redis/src/test/scala/zio/redis/internal/RespCommandArgumentSpec.scala similarity index 87% rename from redis/src/test/scala/zio/redis/RespCommandArgumentSpec.scala rename to redis/src/test/scala/zio/redis/internal/RespCommandArgumentSpec.scala index 5130804a8..117f7c404 100644 --- a/redis/src/test/scala/zio/redis/RespCommandArgumentSpec.scala +++ b/redis/src/test/scala/zio/redis/internal/RespCommandArgumentSpec.scala @@ -1,5 +1,7 @@ -package zio.redis +package zio.redis.internal +import zio.redis._ +import zio.redis.internal.RespCommandArgument import zio.test._ object RespCommandArgumentSpec extends BaseSpec { diff --git a/redis/src/test/scala/zio/redis/RespValueSpec.scala b/redis/src/test/scala/zio/redis/internal/RespValueSpec.scala similarity index 94% rename from redis/src/test/scala/zio/redis/RespValueSpec.scala rename to redis/src/test/scala/zio/redis/internal/RespValueSpec.scala index 8b6b9865d..4a1b0f3b3 100644 --- a/redis/src/test/scala/zio/redis/RespValueSpec.scala +++ b/redis/src/test/scala/zio/redis/internal/RespValueSpec.scala @@ -1,6 +1,8 @@ -package zio.redis +package zio.redis.internal import zio.Chunk +import zio.redis._ +import zio.redis.internal.RespValue import zio.test.Assertion._ import zio.test._ From c225e721f66f1f55e885064deb0539bc4dd1e56e Mon Sep 17 00:00:00 2001 From: Dejan Mijic Date: Wed, 29 Mar 2023 11:33:33 +0200 Subject: [PATCH 13/19] Fix 2.12 --- redis/src/main/scala/zio/redis/internal/RedisCommand.scala | 1 - .../src/main/scala/zio/redis/internal/RespCommandArgument.scala | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/redis/src/main/scala/zio/redis/internal/RedisCommand.scala b/redis/src/main/scala/zio/redis/internal/RedisCommand.scala index 24f80bdbd..84d30e55c 100644 --- a/redis/src/main/scala/zio/redis/internal/RedisCommand.scala +++ b/redis/src/main/scala/zio/redis/internal/RedisCommand.scala @@ -19,7 +19,6 @@ package zio.redis.internal import zio._ import zio.redis.Input.{CommandNameInput, Varargs} import zio.redis._ -import zio.redis.internal.RespCommand private[redis] final class RedisCommand[-In, +Out] private ( val name: String, diff --git a/redis/src/main/scala/zio/redis/internal/RespCommandArgument.scala b/redis/src/main/scala/zio/redis/internal/RespCommandArgument.scala index 8ca9630ac..f2c398b70 100644 --- a/redis/src/main/scala/zio/redis/internal/RespCommandArgument.scala +++ b/redis/src/main/scala/zio/redis/internal/RespCommandArgument.scala @@ -17,10 +17,10 @@ package zio.redis.internal import zio.Chunk -import zio.redis.internal.CRC16 import zio.schema.codec.BinaryCodec import java.nio.charset.StandardCharsets + private[redis] sealed trait RespCommandArgument { def value: RespValue.BulkString } From dd240f47fc785ae429e2cd66f501fd1279d589a8 Mon Sep 17 00:00:00 2001 From: Dejan Mijic Date: Wed, 29 Mar 2023 11:40:59 +0200 Subject: [PATCH 14/19] Move UTF8 codec --- .../main/scala/zio/redis/CodecSupplier.scala | 1 + redis/src/main/scala/zio/redis/Input.scala | 3 +- .../src/main/scala/zio/redis/Utf8Codec.scala | 56 ------------------ .../scala/zio/redis/internal/Utf8Codec.scala | 57 +++++++++++++++++++ .../redis/internal/RedisConnectionSpec.scala | 1 - .../zio/redis/internal/RespValueSpec.scala | 1 - 6 files changed, 59 insertions(+), 60 deletions(-) delete mode 100644 redis/src/main/scala/zio/redis/Utf8Codec.scala create mode 100644 redis/src/main/scala/zio/redis/internal/Utf8Codec.scala diff --git a/redis/src/main/scala/zio/redis/CodecSupplier.scala b/redis/src/main/scala/zio/redis/CodecSupplier.scala index e0f7703df..4fcf7b6e0 100644 --- a/redis/src/main/scala/zio/redis/CodecSupplier.scala +++ b/redis/src/main/scala/zio/redis/CodecSupplier.scala @@ -16,6 +16,7 @@ package zio.redis +import zio.redis.internal.Utf8Codec import zio.schema.Schema import zio.schema.codec.BinaryCodec diff --git a/redis/src/main/scala/zio/redis/Input.scala b/redis/src/main/scala/zio/redis/Input.scala index 5a94e7e0f..289573851 100644 --- a/redis/src/main/scala/zio/redis/Input.scala +++ b/redis/src/main/scala/zio/redis/Input.scala @@ -17,8 +17,7 @@ package zio.redis import zio._ -import zio.redis._ -import zio.redis.internal.{RespCommand, RespCommandArgument} +import zio.redis.internal.{RespCommand, RespCommandArgument, Utf8Codec} import zio.schema.codec.BinaryCodec import java.time.Instant diff --git a/redis/src/main/scala/zio/redis/Utf8Codec.scala b/redis/src/main/scala/zio/redis/Utf8Codec.scala deleted file mode 100644 index 693384f2f..000000000 --- a/redis/src/main/scala/zio/redis/Utf8Codec.scala +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2021 John A. De Goes and the ZIO contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package zio.redis - -import zio.redis.RedisError.CodecError -import zio.schema.Schema -import zio.schema.StandardType.{DoubleType, IntType, LongType} -import zio.schema.codec.BinaryCodec.{BinaryStreamDecoder, BinaryStreamEncoder} -import zio.schema.codec.{BinaryCodec, DecodeError} -import zio.stream.ZPipeline -import zio.{Cause, Chunk, ZIO} - -import java.nio.charset.StandardCharsets - -private[redis] object Utf8Codec { - - implicit def codec[A](implicit schema: Schema[A]): BinaryCodec[A] = new BinaryCodec[A] { - override def encode(value: A): Chunk[Byte] = - schema match { - case Schema.Primitive(_, _) => Chunk.fromArray(value.toString.getBytes(StandardCharsets.UTF_8)) - case _ => throw CodecError("the codec support only primitives") - } - - override def streamEncoder: BinaryStreamEncoder[A] = - ZPipeline.mapChunks(_.flatMap(encode)) - - override def decode(chunk: Chunk[Byte]): Either[DecodeError, A] = { - def utf8String = new String(chunk.toArray, StandardCharsets.UTF_8) - - schema match { - case Schema.Primitive(IntType, _) => Right(utf8String.toInt.asInstanceOf[A]) - case Schema.Primitive(LongType, _) => Right(utf8String.toLong.asInstanceOf[A]) - case Schema.Primitive(DoubleType, _) => Right(utf8String.toDouble.asInstanceOf[A]) - case Schema.Primitive(_, _) => Right(utf8String.asInstanceOf[A]) - case _ => Left(DecodeError.ReadError(Cause.empty, "the codec support only primitives")) - } - } - - override def streamDecoder: BinaryStreamDecoder[A] = - ZPipeline.mapChunksZIO(chunk => ZIO.fromEither(decode(chunk).map(Chunk(_)))) - } -} diff --git a/redis/src/main/scala/zio/redis/internal/Utf8Codec.scala b/redis/src/main/scala/zio/redis/internal/Utf8Codec.scala new file mode 100644 index 000000000..a18f1bac3 --- /dev/null +++ b/redis/src/main/scala/zio/redis/internal/Utf8Codec.scala @@ -0,0 +1,57 @@ +/* + * Copyright 2021 John A. De Goes and the ZIO contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package zio.redis.internal + +import zio.redis.RedisError.CodecError +import zio.schema.Schema +import zio.schema.StandardType.{DoubleType, IntType, LongType} +import zio.schema.codec.BinaryCodec.{BinaryStreamDecoder, BinaryStreamEncoder} +import zio.schema.codec.{BinaryCodec, DecodeError} +import zio.stream.ZPipeline +import zio.{Cause, Chunk, ZIO} + +import java.nio.charset.StandardCharsets + +private[redis] object Utf8Codec { + + implicit def codec[A](implicit schema: Schema[A]): BinaryCodec[A] = + new BinaryCodec[A] { + def encode(value: A): Chunk[Byte] = + schema match { + case Schema.Primitive(_, _) => Chunk.fromArray(value.toString.getBytes(StandardCharsets.UTF_8)) + case _ => throw CodecError("the codec support only primitives") + } + + def streamEncoder: BinaryStreamEncoder[A] = + ZPipeline.mapChunks(_.flatMap(encode)) + + def decode(chunk: Chunk[Byte]): Either[DecodeError, A] = { + def utf8String = new String(chunk.toArray, StandardCharsets.UTF_8) + + schema match { + case Schema.Primitive(IntType, _) => Right(utf8String.toInt.asInstanceOf[A]) + case Schema.Primitive(LongType, _) => Right(utf8String.toLong.asInstanceOf[A]) + case Schema.Primitive(DoubleType, _) => Right(utf8String.toDouble.asInstanceOf[A]) + case Schema.Primitive(_, _) => Right(utf8String.asInstanceOf[A]) + case _ => Left(DecodeError.ReadError(Cause.empty, "the codec support only primitives")) + } + } + + override def streamDecoder: BinaryStreamDecoder[A] = + ZPipeline.mapChunksZIO(chunk => ZIO.fromEither(decode(chunk).map(Chunk(_)))) + } +} diff --git a/redis/src/test/scala/zio/redis/internal/RedisConnectionSpec.scala b/redis/src/test/scala/zio/redis/internal/RedisConnectionSpec.scala index 8ecd34131..c1ce8ac6b 100644 --- a/redis/src/test/scala/zio/redis/internal/RedisConnectionSpec.scala +++ b/redis/src/test/scala/zio/redis/internal/RedisConnectionSpec.scala @@ -1,7 +1,6 @@ package zio.redis.internal import zio.redis._ -import zio.redis.internal.RedisConnection import zio.test.Assertion.{equalTo, isSome} import zio.test.{Spec, assert} import zio.{Chunk, ZIO} diff --git a/redis/src/test/scala/zio/redis/internal/RespValueSpec.scala b/redis/src/test/scala/zio/redis/internal/RespValueSpec.scala index 4a1b0f3b3..7d1f2523e 100644 --- a/redis/src/test/scala/zio/redis/internal/RespValueSpec.scala +++ b/redis/src/test/scala/zio/redis/internal/RespValueSpec.scala @@ -2,7 +2,6 @@ package zio.redis.internal import zio.Chunk import zio.redis._ -import zio.redis.internal.RespValue import zio.test.Assertion._ import zio.test._ From 44270c326b7b03557e4591a67b25c9c8d67b2473 Mon Sep 17 00:00:00 2001 From: Dejan Mijic Date: Wed, 29 Mar 2023 11:45:16 +0200 Subject: [PATCH 15/19] Remove overrides --- redis/src/main/scala/zio/redis/Output.scala | 8 ++++---- .../main/scala/zio/redis/internal/Utf8Codec.scala | 2 +- redis/src/main/scala/zio/redis/options/Geo.scala | 15 +++++++++------ 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/redis/src/main/scala/zio/redis/Output.scala b/redis/src/main/scala/zio/redis/Output.scala index d039d2eca..4ac18ee06 100644 --- a/redis/src/main/scala/zio/redis/Output.scala +++ b/redis/src/main/scala/zio/redis/Output.scala @@ -366,7 +366,7 @@ object Output { } case object StreamGroupsInfoOutput extends Output[Chunk[StreamGroupsInfo]] { - override protected def tryDecode(respValue: RespValue): Chunk[StreamGroupsInfo] = + protected def tryDecode(respValue: RespValue): Chunk[StreamGroupsInfo] = respValue match { case RespValue.NullArray => Chunk.empty case RespValue.Array(messages) => @@ -405,7 +405,7 @@ object Output { } case object StreamConsumersInfoOutput extends Output[Chunk[StreamConsumersInfo]] { - override protected def tryDecode(respValue: RespValue): Chunk[StreamConsumersInfo] = + protected def tryDecode(respValue: RespValue): Chunk[StreamConsumersInfo] = respValue match { case RespValue.NullArray => Chunk.empty case RespValue.Array(messages) => @@ -443,7 +443,7 @@ object Output { final case class StreamInfoFullOutput[I: Schema: BinaryCodec, K: Schema: BinaryCodec, V: Schema: BinaryCodec]() extends Output[StreamInfoWithFull.FullStreamInfo[I, K, V]] { - override protected def tryDecode( + protected def tryDecode( respValue: RespValue ): StreamInfoWithFull.FullStreamInfo[I, K, V] = { var streamInfoFull: StreamInfoWithFull.FullStreamInfo[I, K, V] = StreamInfoWithFull.FullStreamInfo.empty @@ -582,7 +582,7 @@ object Output { final case class StreamInfoOutput[I: Schema: BinaryCodec, K: Schema: BinaryCodec, V: Schema: BinaryCodec]() extends Output[StreamInfo[I, K, V]] { - override protected def tryDecode(respValue: RespValue): StreamInfo[I, K, V] = { + protected def tryDecode(respValue: RespValue): StreamInfo[I, K, V] = { var streamInfo: StreamInfo[I, K, V] = StreamInfo.empty respValue match { // Note that you should not rely on the fields exact position. see https://redis.io/commands/xinfo diff --git a/redis/src/main/scala/zio/redis/internal/Utf8Codec.scala b/redis/src/main/scala/zio/redis/internal/Utf8Codec.scala index a18f1bac3..c04d009a5 100644 --- a/redis/src/main/scala/zio/redis/internal/Utf8Codec.scala +++ b/redis/src/main/scala/zio/redis/internal/Utf8Codec.scala @@ -51,7 +51,7 @@ private[redis] object Utf8Codec { } } - override def streamDecoder: BinaryStreamDecoder[A] = + def streamDecoder: BinaryStreamDecoder[A] = ZPipeline.mapChunksZIO(chunk => ZIO.fromEither(decode(chunk).map(Chunk(_)))) } } diff --git a/redis/src/main/scala/zio/redis/options/Geo.scala b/redis/src/main/scala/zio/redis/options/Geo.scala index d283164d0..98dfbc86c 100644 --- a/redis/src/main/scala/zio/redis/options/Geo.scala +++ b/redis/src/main/scala/zio/redis/options/Geo.scala @@ -44,17 +44,20 @@ trait Geo { def store: Option[Store] def storeDist: Option[StoreDist] } + case class StoreResults(results: Store) extends StoreOptions { - override def store: Option[Store] = Some(results) - override def storeDist: Option[StoreDist] = None + def store: Option[Store] = Some(results) + def storeDist: Option[StoreDist] = None } + case class StoreDistances(distances: StoreDist) extends StoreOptions { - override def store: Option[Store] = None - override def storeDist: Option[StoreDist] = Some(distances) + def store: Option[Store] = None + def storeDist: Option[StoreDist] = Some(distances) } + case class StoreBoth(results: Store, distances: StoreDist) extends StoreOptions { - override def store: Option[Store] = Some(results) - override def storeDist: Option[StoreDist] = Some(distances) + def store: Option[Store] = Some(results) + def storeDist: Option[StoreDist] = Some(distances) } sealed case class StoreDist(key: String) From 5aac91a83c69ba1e5a2b2e895342ed09d83611a7 Mon Sep 17 00:00:00 2001 From: Dejan Mijic Date: Wed, 29 Mar 2023 11:51:45 +0200 Subject: [PATCH 16/19] Introduce line breaks --- redis/src/main/scala/zio/redis/RedisExecutor.scala | 1 + redis/src/main/scala/zio/redis/SingleNodeExecutor.scala | 1 + redis/src/main/scala/zio/redis/api/Scripting.scala | 3 ++- redis/src/main/scala/zio/redis/options/Geo.scala | 4 +--- redis/src/main/scala/zio/redis/options/Keys.scala | 1 - redis/src/main/scala/zio/redis/options/Shared.scala | 1 - redis/src/main/scala/zio/redis/options/Streams.scala | 1 - redis/src/main/scala/zio/redis/options/Strings.scala | 4 +--- redis/src/test/scala/zio/redis/ApiSpec.scala | 1 + redis/src/test/scala/zio/redis/ClusterExecutorSpec.scala | 3 ++- redis/src/test/scala/zio/redis/OutputSpec.scala | 1 + .../scala/zio/redis/internal/RespCommandArgumentSpec.scala | 1 - 12 files changed, 10 insertions(+), 12 deletions(-) diff --git a/redis/src/main/scala/zio/redis/RedisExecutor.scala b/redis/src/main/scala/zio/redis/RedisExecutor.scala index b7d5306f2..7dafc10c8 100644 --- a/redis/src/main/scala/zio/redis/RedisExecutor.scala +++ b/redis/src/main/scala/zio/redis/RedisExecutor.scala @@ -18,6 +18,7 @@ package zio.redis import zio.IO import zio.redis.internal.{RespCommand, RespValue} + trait RedisExecutor { private[redis] def execute(command: RespCommand): IO[RedisError, RespValue] } diff --git a/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala b/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala index e9dbaea70..469c8ea16 100644 --- a/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala +++ b/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala @@ -19,6 +19,7 @@ package zio.redis import zio._ import zio.redis.SingleNodeExecutor._ import zio.redis.internal.{RedisConnection, RespCommand, RespValue} + final class SingleNodeExecutor( reqQueue: Queue[Request], resQueue: Queue[Promise[RedisError, RespValue]], diff --git a/redis/src/main/scala/zio/redis/api/Scripting.scala b/redis/src/main/scala/zio/redis/api/Scripting.scala index a2ec38035..be3f0e96b 100644 --- a/redis/src/main/scala/zio/redis/api/Scripting.scala +++ b/redis/src/main/scala/zio/redis/api/Scripting.scala @@ -19,8 +19,9 @@ package zio.redis.api import zio._ import zio.redis.Output._ import zio.redis.ResultBuilder.ResultOutputBuilder +import zio.redis._ import zio.redis.internal.{RedisCommand, RedisEnvironment} -import zio.redis.{Input, _} + trait Scripting extends RedisEnvironment { import Input._ import Scripting._ diff --git a/redis/src/main/scala/zio/redis/options/Geo.scala b/redis/src/main/scala/zio/redis/options/Geo.scala index 98dfbc86c..97c79faa1 100644 --- a/redis/src/main/scala/zio/redis/options/Geo.scala +++ b/redis/src/main/scala/zio/redis/options/Geo.scala @@ -16,9 +16,7 @@ package zio.redis.options -trait Geo { - this: Shared => - +trait Geo { this: Shared => sealed case class LongLat(longitude: Double, latitude: Double) sealed case class GeoView(member: String, dist: Option[Double], hash: Option[Long], longLat: Option[LongLat]) diff --git a/redis/src/main/scala/zio/redis/options/Keys.scala b/redis/src/main/scala/zio/redis/options/Keys.scala index b1e21ddf1..0d4d55dfc 100644 --- a/redis/src/main/scala/zio/redis/options/Keys.scala +++ b/redis/src/main/scala/zio/redis/options/Keys.scala @@ -17,7 +17,6 @@ package zio.redis.options trait Keys { - case object AbsTtl { private[redis] def asString: String = "ABSTTL" } diff --git a/redis/src/main/scala/zio/redis/options/Shared.scala b/redis/src/main/scala/zio/redis/options/Shared.scala index ba68f8559..2139779ba 100644 --- a/redis/src/main/scala/zio/redis/options/Shared.scala +++ b/redis/src/main/scala/zio/redis/options/Shared.scala @@ -17,7 +17,6 @@ package zio.redis.options trait Shared { - sealed trait Update { self => private[redis] final def asString: String = self match { diff --git a/redis/src/main/scala/zio/redis/options/Streams.scala b/redis/src/main/scala/zio/redis/options/Streams.scala index 502895d9d..2a94e923d 100644 --- a/redis/src/main/scala/zio/redis/options/Streams.scala +++ b/redis/src/main/scala/zio/redis/options/Streams.scala @@ -19,7 +19,6 @@ package zio.redis.options import zio._ trait Streams { - case object WithForce { private[redis] def asString = "FORCE" } diff --git a/redis/src/main/scala/zio/redis/options/Strings.scala b/redis/src/main/scala/zio/redis/options/Strings.scala index 651ab4a68..3addf24c6 100644 --- a/redis/src/main/scala/zio/redis/options/Strings.scala +++ b/redis/src/main/scala/zio/redis/options/Strings.scala @@ -17,9 +17,7 @@ package zio.redis.options trait Strings { - - sealed trait StrAlgoLCS { - self => + sealed trait StrAlgoLCS { self => private[redis] final def asString: String = self match { case StralgoLCS.Strings => "STRINGS" diff --git a/redis/src/test/scala/zio/redis/ApiSpec.scala b/redis/src/test/scala/zio/redis/ApiSpec.scala index 9591a05a9..eb8e12223 100644 --- a/redis/src/test/scala/zio/redis/ApiSpec.scala +++ b/redis/src/test/scala/zio/redis/ApiSpec.scala @@ -3,6 +3,7 @@ package zio.redis import zio._ import zio.test.TestAspect._ import zio.test._ + object ApiSpec extends ConnectionSpec with KeysSpec diff --git a/redis/src/test/scala/zio/redis/ClusterExecutorSpec.scala b/redis/src/test/scala/zio/redis/ClusterExecutorSpec.scala index f27f115eb..d124db050 100644 --- a/redis/src/test/scala/zio/redis/ClusterExecutorSpec.scala +++ b/redis/src/test/scala/zio/redis/ClusterExecutorSpec.scala @@ -1,9 +1,10 @@ package zio.redis +import zio._ import zio.redis.internal.CRC16 import zio.redis.options.Cluster.{Slot, SlotsAmount} import zio.test._ -import zio.{Chunk, Layer, ZIO, ZLayer, durationInt} + object ClusterExecutorSpec extends BaseSpec { def spec: Spec[TestEnvironment, Any] = suite("cluster executor")( diff --git a/redis/src/test/scala/zio/redis/OutputSpec.scala b/redis/src/test/scala/zio/redis/OutputSpec.scala index f9e6e9a43..5b2a11e2e 100644 --- a/redis/src/test/scala/zio/redis/OutputSpec.scala +++ b/redis/src/test/scala/zio/redis/OutputSpec.scala @@ -6,6 +6,7 @@ import zio.redis.RedisError._ import zio.redis.internal.RespValue import zio.test.Assertion._ import zio.test._ + object OutputSpec extends BaseSpec { def spec: Spec[Any, Throwable] = suite("Output decoders")( diff --git a/redis/src/test/scala/zio/redis/internal/RespCommandArgumentSpec.scala b/redis/src/test/scala/zio/redis/internal/RespCommandArgumentSpec.scala index 117f7c404..71e061c4c 100644 --- a/redis/src/test/scala/zio/redis/internal/RespCommandArgumentSpec.scala +++ b/redis/src/test/scala/zio/redis/internal/RespCommandArgumentSpec.scala @@ -1,7 +1,6 @@ package zio.redis.internal import zio.redis._ -import zio.redis.internal.RespCommandArgument import zio.test._ object RespCommandArgumentSpec extends BaseSpec { From c7068f89b5f27e84e44babd3701149a938132e32 Mon Sep 17 00:00:00 2001 From: Dejan Mijic Date: Wed, 29 Mar 2023 12:07:18 +0200 Subject: [PATCH 17/19] Private run --- redis/src/main/scala/zio/redis/SingleNodeExecutor.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala b/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala index 469c8ea16..04955fcca 100644 --- a/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala +++ b/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala @@ -36,7 +36,7 @@ final class SingleNodeExecutor( * Opens a connection to the server and launches send and receive operations. All failures are retried by opening a * new connection. Only exits by interruption or defect. */ - val run: IO[RedisError, AnyVal] = + private val run: IO[RedisError, AnyVal] = ZIO.logTrace(s"$this Executable sender and reader has been started") *> (send.repeat[Any, Long](Schedule.forever) race receive) .tapError(e => ZIO.logWarning(s"Reconnecting due to error: $e") *> drainWith(e)) From 13980a034c5ef20d493d85ab10d129113a6be6c4 Mon Sep 17 00:00:00 2001 From: Dejan Mijic Date: Wed, 29 Mar 2023 12:12:16 +0200 Subject: [PATCH 18/19] Hide executor constructors --- .../scala/zio/redis/ClusterExecutor.scala | 20 ++++++------- .../scala/zio/redis/SingleNodeExecutor.scala | 28 +++++++++---------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/redis/src/main/scala/zio/redis/ClusterExecutor.scala b/redis/src/main/scala/zio/redis/ClusterExecutor.scala index b3b8329d6..cb63d2557 100644 --- a/redis/src/main/scala/zio/redis/ClusterExecutor.scala +++ b/redis/src/main/scala/zio/redis/ClusterExecutor.scala @@ -24,8 +24,8 @@ import zio.redis.options.Cluster._ import java.io.IOException -final case class ClusterExecutor( - clusterConnectionRef: Ref.Synchronized[ClusterConnection], +final class ClusterExecutor private ( + clusterConnection: Ref.Synchronized[ClusterConnection], config: RedisClusterConfig, scope: Scope.Closeable ) extends RedisExecutor { @@ -64,11 +64,11 @@ final case class ClusterExecutor( } private def executor(slot: Slot): IO[RedisError.IOError, RedisExecutor] = - clusterConnectionRef.get.map(_.executor(slot)).flatMap(ZIO.fromOption(_).orElseFail(CusterKeyExecutorError)) + clusterConnection.get.map(_.executor(slot)).flatMap(ZIO.fromOption(_).orElseFail(CusterKeyExecutorError)) // TODO introduce max connection amount private def executor(address: RedisUri): IO[RedisError.IOError, RedisExecutor] = - clusterConnectionRef.modifyZIO { cc => + clusterConnection.modifyZIO { cc => val executorOpt = cc.executors.get(address).map(es => (es.executor, cc)) val enrichedClusterIO = scope.extend[Any](connectToNode(address)).map(es => (es.executor, cc.addExecutor(address, es))) @@ -76,7 +76,7 @@ final case class ClusterExecutor( } private def refreshConnect: IO[RedisError, Unit] = - clusterConnectionRef.updateZIO { connection => + clusterConnection.updateZIO { connection => val addresses = connection.partitions.flatMap(_.addresses) for { cluster <- scope.extend[Any](initConnectToCluster(addresses)) @@ -111,11 +111,11 @@ object ClusterExecutor { scope: Scope.Closeable ): ZIO[Scope, RedisError, ClusterExecutor] = for { - clusterConnection <- initConnectToCluster(config.addresses) - clusterConnectionRef <- Ref.Synchronized.make(clusterConnection) - clusterExec = ClusterExecutor(clusterConnectionRef, config, scope) - _ <- logScopeFinalizer("Cluster executor is closed") - } yield clusterExec + connection <- initConnectToCluster(config.addresses) + ref <- Ref.Synchronized.make(connection) + executor = new ClusterExecutor(ref, config, scope) + _ <- logScopeFinalizer("Cluster executor is closed") + } yield executor private def initConnectToCluster(addresses: Chunk[RedisUri]): ZIO[Scope, RedisError, ClusterConnection] = ZIO diff --git a/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala b/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala index 04955fcca..5c23bbff1 100644 --- a/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala +++ b/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala @@ -20,17 +20,17 @@ import zio._ import zio.redis.SingleNodeExecutor._ import zio.redis.internal.{RedisConnection, RespCommand, RespValue} -final class SingleNodeExecutor( - reqQueue: Queue[Request], - resQueue: Queue[Promise[RedisError, RespValue]], - connection: RedisConnection +final class SingleNodeExecutor private ( + connection: RedisConnection, + requests: Queue[Request], + responses: Queue[Promise[RedisError, RespValue]] ) extends RedisExecutor { // TODO NodeExecutor doesn't throw connection errors, timeout errors, it is hanging forever def execute(command: RespCommand): IO[RedisError, RespValue] = Promise .make[RedisError, RespValue] - .flatMap(promise => reqQueue.offer(Request(command.args.map(_.value), promise)) *> promise.await) + .flatMap(promise => requests.offer(Request(command.args.map(_.value), promise)) *> promise.await) /** * Opens a connection to the server and launches send and receive operations. All failures are retried by opening a @@ -43,10 +43,10 @@ final class SingleNodeExecutor( .retryWhile(True) .tapError(e => ZIO.logError(s"Executor exiting: $e")) - private def drainWith(e: RedisError): UIO[Unit] = resQueue.takeAll.flatMap(ZIO.foreachDiscard(_)(_.fail(e))) + private def drainWith(e: RedisError): UIO[Unit] = responses.takeAll.flatMap(ZIO.foreachDiscard(_)(_.fail(e))) private def send: IO[RedisError.IOError, Option[Unit]] = - reqQueue.takeBetween(1, RequestQueueSize).flatMap { reqs => + requests.takeBetween(1, RequestQueueSize).flatMap { reqs => val buffer = ChunkBuilder.make[Byte]() val it = reqs.iterator @@ -62,7 +62,7 @@ final class SingleNodeExecutor( .mapError(RedisError.IOError(_)) .tapBoth( e => ZIO.foreachDiscard(reqs)(_.promise.fail(e)), - _ => ZIO.foreachDiscard(reqs)(req => resQueue.offer(req.promise)) + _ => ZIO.foreachDiscard(reqs)(req => responses.offer(req.promise)) ) } @@ -71,7 +71,7 @@ final class SingleNodeExecutor( .mapError(RedisError.IOError(_)) .via(RespValue.Decoder) .collectSome - .foreach(response => resQueue.take.flatMap(_.succeed(response))) + .foreach(response => responses.take.flatMap(_.succeed(response))) } @@ -90,11 +90,11 @@ object SingleNodeExecutor { private[redis] def create(connection: RedisConnection): URIO[Scope, SingleNodeExecutor] = for { - reqQueue <- Queue.bounded[Request](RequestQueueSize) - resQueue <- Queue.unbounded[Promise[RedisError, RespValue]] - executor = new SingleNodeExecutor(reqQueue, resQueue, connection) - _ <- executor.run.forkScoped - _ <- logScopeFinalizer(s"$executor Node Executor is closed") + requests <- Queue.bounded[Request](RequestQueueSize) + responses <- Queue.unbounded[Promise[RedisError, RespValue]] + executor = new SingleNodeExecutor(connection, requests, responses) + _ <- executor.run.forkScoped + _ <- logScopeFinalizer(s"$executor Node Executor is closed") } yield executor private def makeLayer: ZLayer[RedisConnection, RedisError.IOError, RedisExecutor] = From 7dfc30ed892a0e53b01c5811c334427be302938d Mon Sep 17 00:00:00 2001 From: Dejan Mijic Date: Wed, 29 Mar 2023 12:16:11 +0200 Subject: [PATCH 19/19] Make request private --- redis/src/main/scala/zio/redis/SingleNodeExecutor.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala b/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala index 5c23bbff1..a821ecfe8 100644 --- a/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala +++ b/redis/src/main/scala/zio/redis/SingleNodeExecutor.scala @@ -82,7 +82,7 @@ object SingleNodeExecutor { lazy val local: ZLayer[Any, RedisError.IOError, RedisExecutor] = RedisConnection.local >>> makeLayer - final case class Request(command: Chunk[RespValue.BulkString], promise: Promise[RedisError, RespValue]) + private final case class Request(command: Chunk[RespValue.BulkString], promise: Promise[RedisError, RespValue]) private final val True: Any => Boolean = _ => true