coursier.cli.install.SharedChannelParams.scala Maven / Gradle / Ivy
package coursier.cli.install
import java.io.File
import java.nio.charset.StandardCharsets
import java.nio.file.Files
import cats.data.{NonEmptyList, Validated, ValidatedNel}
import cats.implicits._
import coursier.install.Channel
import coursier.install.Channels
final case class SharedChannelParams(
channels: Seq[Channel]
)
object SharedChannelParams {
def apply(options: SharedChannelOptions): ValidatedNel[String, SharedChannelParams] = {
val channelsV = options
.channel
.traverse { s =>
val e = Channel.parse(s)
.left.map(NonEmptyList.one)
Validated.fromEither(e)
}
val defaultChannels =
if (options.defaultChannels) Channels.defaultChannels
else Nil
val contribChannels =
if (options.contrib) Channels.contribChannels
else Nil
val fileChannelsV =
if (options.fileChannels) {
val configDir = coursier.paths.CoursierPaths.configDirectory()
val channelDir = new File(configDir, "channels")
val files = Option(channelDir.listFiles())
.getOrElse(Array.empty[File])
.filter(f => !f.getName.startsWith("."))
val rawChannels = files.toList.flatMap { f =>
val b = Files.readAllBytes(f.toPath)
val s = new String(b, StandardCharsets.UTF_8)
s.linesIterator.map(_.trim).filter(_.nonEmpty).toSeq
}
rawChannels.traverse { s =>
val e = Channel.parse(s)
.left.map(NonEmptyList.one)
Validated.fromEither(e)
}
} else
Validated.validNel(Nil)
(channelsV, fileChannelsV).mapN {
(channels, fileChannels) =>
SharedChannelParams(
(channels ++ fileChannels ++ defaultChannels ++ contribChannels).distinct
)
}
}
}