diff --git a/core/jvm/src/main/scala/works/iterative/core/service/impl/JcaDigestGenerator.scala b/core/jvm/src/main/scala/works/iterative/core/service/impl/JcaDigestGenerator.scala new file mode 100644 index 0000000..0fbb024 --- /dev/null +++ b/core/jvm/src/main/scala/works/iterative/core/service/impl/JcaDigestGenerator.scala @@ -0,0 +1,25 @@ +package works.iterative.core +package service +package impl + +import zio.* +import zio.stream.* + +class JcaDigestGenerator extends DigestGenerator: + + override def generateDigest( + algorithm: DigestAlgorithm, + content: UStream[Byte] + ): UIO[Digest] = { + for + md <- ZIO.attempt( + java.security.MessageDigest.getInstance(algorithm.value) + ) + _ <- content.runForeachChunk(e => ZIO.attempt(md.update(e.toArray))) + digest <- ZIO.attempt(md.digest()) + yield Digest(algorithm, digest) + }.orDie + +object JcaDigestGenerator: + val layer: ULayer[DigestGenerator] = + ZLayer.succeed(new JcaDigestGenerator) diff --git a/core/jvm/src/main/scala/works/iterative/core/service/impl/JcaDigestGenerator.scala b/core/jvm/src/main/scala/works/iterative/core/service/impl/JcaDigestGenerator.scala new file mode 100644 index 0000000..0fbb024 --- /dev/null +++ b/core/jvm/src/main/scala/works/iterative/core/service/impl/JcaDigestGenerator.scala @@ -0,0 +1,25 @@ +package works.iterative.core +package service +package impl + +import zio.* +import zio.stream.* + +class JcaDigestGenerator extends DigestGenerator: + + override def generateDigest( + algorithm: DigestAlgorithm, + content: UStream[Byte] + ): UIO[Digest] = { + for + md <- ZIO.attempt( + java.security.MessageDigest.getInstance(algorithm.value) + ) + _ <- content.runForeachChunk(e => ZIO.attempt(md.update(e.toArray))) + digest <- ZIO.attempt(md.digest()) + yield Digest(algorithm, digest) + }.orDie + +object JcaDigestGenerator: + val layer: ULayer[DigestGenerator] = + ZLayer.succeed(new JcaDigestGenerator) diff --git a/core/shared/src/main/scala/works/iterative/core/Digest.scala b/core/shared/src/main/scala/works/iterative/core/Digest.scala new file mode 100644 index 0000000..17db0e2 --- /dev/null +++ b/core/shared/src/main/scala/works/iterative/core/Digest.scala @@ -0,0 +1,23 @@ +package works.iterative.core + +import works.iterative.core.service.DigestGenerator + +import zio.* + +opaque type DigestAlgorithm = String + +object DigestAlgorithm: + val SHA256: DigestAlgorithm = "SHA-256" + extension (d: DigestAlgorithm) def value: String = d + +final case class Digest( + algorithm: DigestAlgorithm, + value: Array[Byte] +) + +object Digest: + def compute( + algorithm: DigestAlgorithm, + value: Array[Byte] + ): URIO[DigestGenerator, Digest] = + DigestGenerator.generateDigest(algorithm, value) diff --git a/core/jvm/src/main/scala/works/iterative/core/service/impl/JcaDigestGenerator.scala b/core/jvm/src/main/scala/works/iterative/core/service/impl/JcaDigestGenerator.scala new file mode 100644 index 0000000..0fbb024 --- /dev/null +++ b/core/jvm/src/main/scala/works/iterative/core/service/impl/JcaDigestGenerator.scala @@ -0,0 +1,25 @@ +package works.iterative.core +package service +package impl + +import zio.* +import zio.stream.* + +class JcaDigestGenerator extends DigestGenerator: + + override def generateDigest( + algorithm: DigestAlgorithm, + content: UStream[Byte] + ): UIO[Digest] = { + for + md <- ZIO.attempt( + java.security.MessageDigest.getInstance(algorithm.value) + ) + _ <- content.runForeachChunk(e => ZIO.attempt(md.update(e.toArray))) + digest <- ZIO.attempt(md.digest()) + yield Digest(algorithm, digest) + }.orDie + +object JcaDigestGenerator: + val layer: ULayer[DigestGenerator] = + ZLayer.succeed(new JcaDigestGenerator) diff --git a/core/shared/src/main/scala/works/iterative/core/Digest.scala b/core/shared/src/main/scala/works/iterative/core/Digest.scala new file mode 100644 index 0000000..17db0e2 --- /dev/null +++ b/core/shared/src/main/scala/works/iterative/core/Digest.scala @@ -0,0 +1,23 @@ +package works.iterative.core + +import works.iterative.core.service.DigestGenerator + +import zio.* + +opaque type DigestAlgorithm = String + +object DigestAlgorithm: + val SHA256: DigestAlgorithm = "SHA-256" + extension (d: DigestAlgorithm) def value: String = d + +final case class Digest( + algorithm: DigestAlgorithm, + value: Array[Byte] +) + +object Digest: + def compute( + algorithm: DigestAlgorithm, + value: Array[Byte] + ): URIO[DigestGenerator, Digest] = + DigestGenerator.generateDigest(algorithm, value) diff --git a/core/shared/src/main/scala/works/iterative/core/FileRef.scala b/core/shared/src/main/scala/works/iterative/core/FileRef.scala index 56bce04..ff46a45 100644 --- a/core/shared/src/main/scala/works/iterative/core/FileRef.scala +++ b/core/shared/src/main/scala/works/iterative/core/FileRef.scala @@ -1,9 +1,28 @@ package works.iterative.core /** Represents a reference to a file */ -case class FileRef( +case class FileRef private ( name: String, url: String, fileType: Option[String], size: Option[String] ) + +object FileRef: + def apply( + name: String, + url: String, + fileType: Option[String] = None, + size: Option[String] = None + ): Validated[FileRef] = + for + name <- Validated.nonEmptyString("file.name")(name) + url <- Validated.nonEmptyString("file.url")(url) + yield new FileRef(name, url, fileType, size) + + def unsafe( + name: String, + url: String, + fileType: Option[String] = None, + size: Option[String] = None + ): FileRef = new FileRef(name, url, fileType, size) diff --git a/core/jvm/src/main/scala/works/iterative/core/service/impl/JcaDigestGenerator.scala b/core/jvm/src/main/scala/works/iterative/core/service/impl/JcaDigestGenerator.scala new file mode 100644 index 0000000..0fbb024 --- /dev/null +++ b/core/jvm/src/main/scala/works/iterative/core/service/impl/JcaDigestGenerator.scala @@ -0,0 +1,25 @@ +package works.iterative.core +package service +package impl + +import zio.* +import zio.stream.* + +class JcaDigestGenerator extends DigestGenerator: + + override def generateDigest( + algorithm: DigestAlgorithm, + content: UStream[Byte] + ): UIO[Digest] = { + for + md <- ZIO.attempt( + java.security.MessageDigest.getInstance(algorithm.value) + ) + _ <- content.runForeachChunk(e => ZIO.attempt(md.update(e.toArray))) + digest <- ZIO.attempt(md.digest()) + yield Digest(algorithm, digest) + }.orDie + +object JcaDigestGenerator: + val layer: ULayer[DigestGenerator] = + ZLayer.succeed(new JcaDigestGenerator) diff --git a/core/shared/src/main/scala/works/iterative/core/Digest.scala b/core/shared/src/main/scala/works/iterative/core/Digest.scala new file mode 100644 index 0000000..17db0e2 --- /dev/null +++ b/core/shared/src/main/scala/works/iterative/core/Digest.scala @@ -0,0 +1,23 @@ +package works.iterative.core + +import works.iterative.core.service.DigestGenerator + +import zio.* + +opaque type DigestAlgorithm = String + +object DigestAlgorithm: + val SHA256: DigestAlgorithm = "SHA-256" + extension (d: DigestAlgorithm) def value: String = d + +final case class Digest( + algorithm: DigestAlgorithm, + value: Array[Byte] +) + +object Digest: + def compute( + algorithm: DigestAlgorithm, + value: Array[Byte] + ): URIO[DigestGenerator, Digest] = + DigestGenerator.generateDigest(algorithm, value) diff --git a/core/shared/src/main/scala/works/iterative/core/FileRef.scala b/core/shared/src/main/scala/works/iterative/core/FileRef.scala index 56bce04..ff46a45 100644 --- a/core/shared/src/main/scala/works/iterative/core/FileRef.scala +++ b/core/shared/src/main/scala/works/iterative/core/FileRef.scala @@ -1,9 +1,28 @@ package works.iterative.core /** Represents a reference to a file */ -case class FileRef( +case class FileRef private ( name: String, url: String, fileType: Option[String], size: Option[String] ) + +object FileRef: + def apply( + name: String, + url: String, + fileType: Option[String] = None, + size: Option[String] = None + ): Validated[FileRef] = + for + name <- Validated.nonEmptyString("file.name")(name) + url <- Validated.nonEmptyString("file.url")(url) + yield new FileRef(name, url, fileType, size) + + def unsafe( + name: String, + url: String, + fileType: Option[String] = None, + size: Option[String] = None + ): FileRef = new FileRef(name, url, fileType, size) diff --git a/core/shared/src/main/scala/works/iterative/core/Validated.scala b/core/shared/src/main/scala/works/iterative/core/Validated.scala index 0b94e22..f633095 100644 --- a/core/shared/src/main/scala/works/iterative/core/Validated.scala +++ b/core/shared/src/main/scala/works/iterative/core/Validated.scala @@ -14,3 +14,7 @@ _.trim.nonEmpty ) .map(_.trim) + + def positiveInt(lkey: String)(value: Int): Validated[Int] = + Validation + .fromPredicateWith(UserMessage(s"error.positive.$lkey"))(value)(_ > 0) diff --git a/core/jvm/src/main/scala/works/iterative/core/service/impl/JcaDigestGenerator.scala b/core/jvm/src/main/scala/works/iterative/core/service/impl/JcaDigestGenerator.scala new file mode 100644 index 0000000..0fbb024 --- /dev/null +++ b/core/jvm/src/main/scala/works/iterative/core/service/impl/JcaDigestGenerator.scala @@ -0,0 +1,25 @@ +package works.iterative.core +package service +package impl + +import zio.* +import zio.stream.* + +class JcaDigestGenerator extends DigestGenerator: + + override def generateDigest( + algorithm: DigestAlgorithm, + content: UStream[Byte] + ): UIO[Digest] = { + for + md <- ZIO.attempt( + java.security.MessageDigest.getInstance(algorithm.value) + ) + _ <- content.runForeachChunk(e => ZIO.attempt(md.update(e.toArray))) + digest <- ZIO.attempt(md.digest()) + yield Digest(algorithm, digest) + }.orDie + +object JcaDigestGenerator: + val layer: ULayer[DigestGenerator] = + ZLayer.succeed(new JcaDigestGenerator) diff --git a/core/shared/src/main/scala/works/iterative/core/Digest.scala b/core/shared/src/main/scala/works/iterative/core/Digest.scala new file mode 100644 index 0000000..17db0e2 --- /dev/null +++ b/core/shared/src/main/scala/works/iterative/core/Digest.scala @@ -0,0 +1,23 @@ +package works.iterative.core + +import works.iterative.core.service.DigestGenerator + +import zio.* + +opaque type DigestAlgorithm = String + +object DigestAlgorithm: + val SHA256: DigestAlgorithm = "SHA-256" + extension (d: DigestAlgorithm) def value: String = d + +final case class Digest( + algorithm: DigestAlgorithm, + value: Array[Byte] +) + +object Digest: + def compute( + algorithm: DigestAlgorithm, + value: Array[Byte] + ): URIO[DigestGenerator, Digest] = + DigestGenerator.generateDigest(algorithm, value) diff --git a/core/shared/src/main/scala/works/iterative/core/FileRef.scala b/core/shared/src/main/scala/works/iterative/core/FileRef.scala index 56bce04..ff46a45 100644 --- a/core/shared/src/main/scala/works/iterative/core/FileRef.scala +++ b/core/shared/src/main/scala/works/iterative/core/FileRef.scala @@ -1,9 +1,28 @@ package works.iterative.core /** Represents a reference to a file */ -case class FileRef( +case class FileRef private ( name: String, url: String, fileType: Option[String], size: Option[String] ) + +object FileRef: + def apply( + name: String, + url: String, + fileType: Option[String] = None, + size: Option[String] = None + ): Validated[FileRef] = + for + name <- Validated.nonEmptyString("file.name")(name) + url <- Validated.nonEmptyString("file.url")(url) + yield new FileRef(name, url, fileType, size) + + def unsafe( + name: String, + url: String, + fileType: Option[String] = None, + size: Option[String] = None + ): FileRef = new FileRef(name, url, fileType, size) diff --git a/core/shared/src/main/scala/works/iterative/core/Validated.scala b/core/shared/src/main/scala/works/iterative/core/Validated.scala index 0b94e22..f633095 100644 --- a/core/shared/src/main/scala/works/iterative/core/Validated.scala +++ b/core/shared/src/main/scala/works/iterative/core/Validated.scala @@ -14,3 +14,7 @@ _.trim.nonEmpty ) .map(_.trim) + + def positiveInt(lkey: String)(value: Int): Validated[Int] = + Validation + .fromPredicateWith(UserMessage(s"error.positive.$lkey"))(value)(_ > 0) diff --git a/core/shared/src/main/scala/works/iterative/core/service/DigestGenerator.scala b/core/shared/src/main/scala/works/iterative/core/service/DigestGenerator.scala new file mode 100644 index 0000000..5cbfa3d --- /dev/null +++ b/core/shared/src/main/scala/works/iterative/core/service/DigestGenerator.scala @@ -0,0 +1,26 @@ +package works.iterative.core.service + +import works.iterative.core.Digest +import works.iterative.core.DigestAlgorithm + +import zio.* +import zio.stream.* + +trait DigestGenerator: + def generateDigest( + algorithm: DigestAlgorithm, + content: UStream[Byte] + ): UIO[Digest] + +object DigestGenerator: + def generateDigest( + algorithm: DigestAlgorithm, + content: UStream[Byte] + ): URIO[DigestGenerator, Digest] = + ZIO.serviceWithZIO[DigestGenerator](_.generateDigest(algorithm, content)) + + def generateDigest( + algorithm: DigestAlgorithm, + content: Array[Byte] + ): URIO[DigestGenerator, Digest] = + generateDigest(algorithm, ZStream.fromChunk(Chunk.fromArray(content))) diff --git a/core/jvm/src/main/scala/works/iterative/core/service/impl/JcaDigestGenerator.scala b/core/jvm/src/main/scala/works/iterative/core/service/impl/JcaDigestGenerator.scala new file mode 100644 index 0000000..0fbb024 --- /dev/null +++ b/core/jvm/src/main/scala/works/iterative/core/service/impl/JcaDigestGenerator.scala @@ -0,0 +1,25 @@ +package works.iterative.core +package service +package impl + +import zio.* +import zio.stream.* + +class JcaDigestGenerator extends DigestGenerator: + + override def generateDigest( + algorithm: DigestAlgorithm, + content: UStream[Byte] + ): UIO[Digest] = { + for + md <- ZIO.attempt( + java.security.MessageDigest.getInstance(algorithm.value) + ) + _ <- content.runForeachChunk(e => ZIO.attempt(md.update(e.toArray))) + digest <- ZIO.attempt(md.digest()) + yield Digest(algorithm, digest) + }.orDie + +object JcaDigestGenerator: + val layer: ULayer[DigestGenerator] = + ZLayer.succeed(new JcaDigestGenerator) diff --git a/core/shared/src/main/scala/works/iterative/core/Digest.scala b/core/shared/src/main/scala/works/iterative/core/Digest.scala new file mode 100644 index 0000000..17db0e2 --- /dev/null +++ b/core/shared/src/main/scala/works/iterative/core/Digest.scala @@ -0,0 +1,23 @@ +package works.iterative.core + +import works.iterative.core.service.DigestGenerator + +import zio.* + +opaque type DigestAlgorithm = String + +object DigestAlgorithm: + val SHA256: DigestAlgorithm = "SHA-256" + extension (d: DigestAlgorithm) def value: String = d + +final case class Digest( + algorithm: DigestAlgorithm, + value: Array[Byte] +) + +object Digest: + def compute( + algorithm: DigestAlgorithm, + value: Array[Byte] + ): URIO[DigestGenerator, Digest] = + DigestGenerator.generateDigest(algorithm, value) diff --git a/core/shared/src/main/scala/works/iterative/core/FileRef.scala b/core/shared/src/main/scala/works/iterative/core/FileRef.scala index 56bce04..ff46a45 100644 --- a/core/shared/src/main/scala/works/iterative/core/FileRef.scala +++ b/core/shared/src/main/scala/works/iterative/core/FileRef.scala @@ -1,9 +1,28 @@ package works.iterative.core /** Represents a reference to a file */ -case class FileRef( +case class FileRef private ( name: String, url: String, fileType: Option[String], size: Option[String] ) + +object FileRef: + def apply( + name: String, + url: String, + fileType: Option[String] = None, + size: Option[String] = None + ): Validated[FileRef] = + for + name <- Validated.nonEmptyString("file.name")(name) + url <- Validated.nonEmptyString("file.url")(url) + yield new FileRef(name, url, fileType, size) + + def unsafe( + name: String, + url: String, + fileType: Option[String] = None, + size: Option[String] = None + ): FileRef = new FileRef(name, url, fileType, size) diff --git a/core/shared/src/main/scala/works/iterative/core/Validated.scala b/core/shared/src/main/scala/works/iterative/core/Validated.scala index 0b94e22..f633095 100644 --- a/core/shared/src/main/scala/works/iterative/core/Validated.scala +++ b/core/shared/src/main/scala/works/iterative/core/Validated.scala @@ -14,3 +14,7 @@ _.trim.nonEmpty ) .map(_.trim) + + def positiveInt(lkey: String)(value: Int): Validated[Int] = + Validation + .fromPredicateWith(UserMessage(s"error.positive.$lkey"))(value)(_ > 0) diff --git a/core/shared/src/main/scala/works/iterative/core/service/DigestGenerator.scala b/core/shared/src/main/scala/works/iterative/core/service/DigestGenerator.scala new file mode 100644 index 0000000..5cbfa3d --- /dev/null +++ b/core/shared/src/main/scala/works/iterative/core/service/DigestGenerator.scala @@ -0,0 +1,26 @@ +package works.iterative.core.service + +import works.iterative.core.Digest +import works.iterative.core.DigestAlgorithm + +import zio.* +import zio.stream.* + +trait DigestGenerator: + def generateDigest( + algorithm: DigestAlgorithm, + content: UStream[Byte] + ): UIO[Digest] + +object DigestGenerator: + def generateDigest( + algorithm: DigestAlgorithm, + content: UStream[Byte] + ): URIO[DigestGenerator, Digest] = + ZIO.serviceWithZIO[DigestGenerator](_.generateDigest(algorithm, content)) + + def generateDigest( + algorithm: DigestAlgorithm, + content: Array[Byte] + ): URIO[DigestGenerator, Digest] = + generateDigest(algorithm, ZStream.fromChunk(Chunk.fromArray(content))) diff --git a/core/shared/src/main/scala/works/iterative/core/service/FileStore.scala b/core/shared/src/main/scala/works/iterative/core/service/FileStore.scala new file mode 100644 index 0000000..273113e --- /dev/null +++ b/core/shared/src/main/scala/works/iterative/core/service/FileStore.scala @@ -0,0 +1,16 @@ +package works.iterative.core.service + +import works.iterative.core.FileSupport.* +import works.iterative.core.FileRef +import works.iterative.core.UserMessage + +import zio.* + +trait FileStore: + type Op[A] = IO[UserMessage, A] + def store(file: FileRepr): Op[FileRef] + +object FileStore: + type Op[A] = ZIO[FileStore, UserMessage, A] + def store(file: FileRepr): Op[FileRef] = + ZIO.serviceWithZIO(_.store(file)) diff --git a/core/jvm/src/main/scala/works/iterative/core/service/impl/JcaDigestGenerator.scala b/core/jvm/src/main/scala/works/iterative/core/service/impl/JcaDigestGenerator.scala new file mode 100644 index 0000000..0fbb024 --- /dev/null +++ b/core/jvm/src/main/scala/works/iterative/core/service/impl/JcaDigestGenerator.scala @@ -0,0 +1,25 @@ +package works.iterative.core +package service +package impl + +import zio.* +import zio.stream.* + +class JcaDigestGenerator extends DigestGenerator: + + override def generateDigest( + algorithm: DigestAlgorithm, + content: UStream[Byte] + ): UIO[Digest] = { + for + md <- ZIO.attempt( + java.security.MessageDigest.getInstance(algorithm.value) + ) + _ <- content.runForeachChunk(e => ZIO.attempt(md.update(e.toArray))) + digest <- ZIO.attempt(md.digest()) + yield Digest(algorithm, digest) + }.orDie + +object JcaDigestGenerator: + val layer: ULayer[DigestGenerator] = + ZLayer.succeed(new JcaDigestGenerator) diff --git a/core/shared/src/main/scala/works/iterative/core/Digest.scala b/core/shared/src/main/scala/works/iterative/core/Digest.scala new file mode 100644 index 0000000..17db0e2 --- /dev/null +++ b/core/shared/src/main/scala/works/iterative/core/Digest.scala @@ -0,0 +1,23 @@ +package works.iterative.core + +import works.iterative.core.service.DigestGenerator + +import zio.* + +opaque type DigestAlgorithm = String + +object DigestAlgorithm: + val SHA256: DigestAlgorithm = "SHA-256" + extension (d: DigestAlgorithm) def value: String = d + +final case class Digest( + algorithm: DigestAlgorithm, + value: Array[Byte] +) + +object Digest: + def compute( + algorithm: DigestAlgorithm, + value: Array[Byte] + ): URIO[DigestGenerator, Digest] = + DigestGenerator.generateDigest(algorithm, value) diff --git a/core/shared/src/main/scala/works/iterative/core/FileRef.scala b/core/shared/src/main/scala/works/iterative/core/FileRef.scala index 56bce04..ff46a45 100644 --- a/core/shared/src/main/scala/works/iterative/core/FileRef.scala +++ b/core/shared/src/main/scala/works/iterative/core/FileRef.scala @@ -1,9 +1,28 @@ package works.iterative.core /** Represents a reference to a file */ -case class FileRef( +case class FileRef private ( name: String, url: String, fileType: Option[String], size: Option[String] ) + +object FileRef: + def apply( + name: String, + url: String, + fileType: Option[String] = None, + size: Option[String] = None + ): Validated[FileRef] = + for + name <- Validated.nonEmptyString("file.name")(name) + url <- Validated.nonEmptyString("file.url")(url) + yield new FileRef(name, url, fileType, size) + + def unsafe( + name: String, + url: String, + fileType: Option[String] = None, + size: Option[String] = None + ): FileRef = new FileRef(name, url, fileType, size) diff --git a/core/shared/src/main/scala/works/iterative/core/Validated.scala b/core/shared/src/main/scala/works/iterative/core/Validated.scala index 0b94e22..f633095 100644 --- a/core/shared/src/main/scala/works/iterative/core/Validated.scala +++ b/core/shared/src/main/scala/works/iterative/core/Validated.scala @@ -14,3 +14,7 @@ _.trim.nonEmpty ) .map(_.trim) + + def positiveInt(lkey: String)(value: Int): Validated[Int] = + Validation + .fromPredicateWith(UserMessage(s"error.positive.$lkey"))(value)(_ > 0) diff --git a/core/shared/src/main/scala/works/iterative/core/service/DigestGenerator.scala b/core/shared/src/main/scala/works/iterative/core/service/DigestGenerator.scala new file mode 100644 index 0000000..5cbfa3d --- /dev/null +++ b/core/shared/src/main/scala/works/iterative/core/service/DigestGenerator.scala @@ -0,0 +1,26 @@ +package works.iterative.core.service + +import works.iterative.core.Digest +import works.iterative.core.DigestAlgorithm + +import zio.* +import zio.stream.* + +trait DigestGenerator: + def generateDigest( + algorithm: DigestAlgorithm, + content: UStream[Byte] + ): UIO[Digest] + +object DigestGenerator: + def generateDigest( + algorithm: DigestAlgorithm, + content: UStream[Byte] + ): URIO[DigestGenerator, Digest] = + ZIO.serviceWithZIO[DigestGenerator](_.generateDigest(algorithm, content)) + + def generateDigest( + algorithm: DigestAlgorithm, + content: Array[Byte] + ): URIO[DigestGenerator, Digest] = + generateDigest(algorithm, ZStream.fromChunk(Chunk.fromArray(content))) diff --git a/core/shared/src/main/scala/works/iterative/core/service/FileStore.scala b/core/shared/src/main/scala/works/iterative/core/service/FileStore.scala new file mode 100644 index 0000000..273113e --- /dev/null +++ b/core/shared/src/main/scala/works/iterative/core/service/FileStore.scala @@ -0,0 +1,16 @@ +package works.iterative.core.service + +import works.iterative.core.FileSupport.* +import works.iterative.core.FileRef +import works.iterative.core.UserMessage + +import zio.* + +trait FileStore: + type Op[A] = IO[UserMessage, A] + def store(file: FileRepr): Op[FileRef] + +object FileStore: + type Op[A] = ZIO[FileStore, UserMessage, A] + def store(file: FileRepr): Op[FileRef] = + ZIO.serviceWithZIO(_.store(file)) diff --git a/core/shared/src/main/scala/works/iterative/core/service/impl/InMemoryFileStore.scala b/core/shared/src/main/scala/works/iterative/core/service/impl/InMemoryFileStore.scala new file mode 100644 index 0000000..e2004d7 --- /dev/null +++ b/core/shared/src/main/scala/works/iterative/core/service/impl/InMemoryFileStore.scala @@ -0,0 +1,14 @@ +package works.iterative.core.service +package impl + +import works.iterative.core.FileSupport.* +import works.iterative.core.FileRef +import zio.* + +object InMemoryFileStore: + val layer: ULayer[FileStore] = ZLayer.succeed { + new FileStore: + override def store(file: FileRepr): Op[FileRef] = + for ref <- FileRef(file.name, "#").toZIO + yield ref + }