cataquack/cataquackJsonDir/src/main/scala/tf/bug/cataquack/jsondir/JSONDirectoryStorage.scala

42 lines
965 B
Scala

package tf.bug.cataquack.jsondir
import implicits._
import java.nio.file.Path
import cats.effect.IO
import io.circe._
import io.circe.parser._
import tf.bug.cataquack.{IORaw, Raw, Storage}
import scala.io.Source
import scala.util.Try
object JSONDirectoryStorage {
def apply(p: Path): Try[Storage[IORaw[Json, ?], Decoder]] = Try {
if (p.toFile.isDirectory) {
new Storage[IORaw[Json, ?], Decoder] {
override def query[T](key: String): IORaw[Json, T] = IO {
val nf = p.resolve(key).toFile
val s = Source.fromFile(nf).mkString
val j = parse(s).right.get
Raw[Json, T](j)
}
/** Type like List, Id, etc */
override type Output[T] = IO[T]
override def execute[T: Decoder](
f: IORaw[Json, T]
): Output[T] = {
f.map(_.read)
}
}
} else {
throw new IllegalArgumentException("Supplied path must be a directory!")
}
}
}