in modules/core/src/main/scala/org/scalasteward/core/io/FileAlg.scala [73:129]
def create[F[_]](implicit logger: Logger[F], F: Sync[F]): FileAlg[F] =
new FileAlg[F] {
override def deleteForce(file: File): F[Unit] =
F.blocking {
if (file.exists) FileUtils.forceDelete(file.toJava)
if (file.exists) file.delete()
}
override def ensureExists(dir: File): F[File] =
F.blocking {
if (!dir.exists) dir.createDirectories()
dir
}
override def isDirectory(file: File): F[Boolean] =
F.blocking(file.isDirectory(File.LinkOptions.noFollow))
override def isNonEmptyDirectory(dir: File): F[Boolean] =
F.blocking(dir.isDirectory(File.LinkOptions.noFollow) && dir.nonEmpty)
override def isRegularFile(file: File): F[Boolean] =
F.blocking(file.isRegularFile(File.LinkOptions.noFollow))
override def removeTemporarily(file: File): Resource[F, Unit] =
Resource.make {
F.blocking {
val copyOptions = File.CopyOptions(overwrite = true)
Option.when(file.exists)(file.moveTo(File.newTemporaryFile())(copyOptions))
}
} {
case Some(tmpFile) => F.blocking(tmpFile.moveTo(file)).void
case None => F.unit
}.void
override def readFile(file: File): F[Option[String]] =
F.blocking(Option.when(file.exists)(file.contentAsString))
override def readResource(resource: String): F[String] =
readSource(F.blocking(Source.fromResource(resource)))
override def readUri(uri: Uri): F[String] = {
val scheme = uri.scheme.getOrElse(scheme"file")
val withScheme = uri.copy(scheme = Some(scheme))
readSource(F.blocking(Source.fromURL(withScheme.renderString)))
}
private def readSource(source: F[Source]): F[String] =
Resource.fromAutoCloseable(source).use(src => F.blocking(src.mkString))
override def walk(dir: File, maxDepth: Int): Stream[F, File] =
Stream.eval(F.delay(dir.walk(maxDepth))).flatMap(Stream.fromBlockingIterator(_, 1))
override def writeFile(file: File, content: String): F[Unit] =
logger.debug(s"Write $file") >>
file.parentOption.fold(F.unit)(ensureExists(_).void) >>
F.blocking(file.write(content)).void
}