All Downloads are FREE. Search and download functionalities are using the official Maven repository.

pureconfig.error.ConfigReaderFailures.scala Maven / Gradle / Ivy

/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package pureconfig.error

import scala.collection.mutable

/** A non-empty list of ConfigReader failures
  */
case class ConfigReaderFailures(head: ConfigReaderFailure, tail: ConfigReaderFailure*) {

  def toList: List[ConfigReaderFailure] = head :: tail.toList

  def +:(failure: ConfigReaderFailure): ConfigReaderFailures =
    ConfigReaderFailures(failure, this.toList: _*)

  def ++(that: ConfigReaderFailures): ConfigReaderFailures =
    ConfigReaderFailures(head, (tail ++ that.toList): _*)

  def prettyPrint(indentLevel: Int = 0): String = {
    def tabs(n: Int): String = " " * ((indentLevel + n) * 2)
    def descriptionWithOrigin(failure: ConfigReaderFailure, indent: Int): String = {
      val failureLines = failure.description.split("\n")
      (failure.origin.fold(s"${tabs(indent)}- ${failureLines.head}")(f =>
        s"${tabs(indent)}- (${f.description}) ${failureLines.head}"
      ) ::
        failureLines.tail.map(l => s"${tabs(indent + 1)}$l").toList).mkString("\n")
    }

    val linesBuffer = mutable.Buffer.empty[String]
    val (convertFailures, otherFailures) = this.toList.partition(_.isInstanceOf[ConvertFailure])

    val failuresByPath = convertFailures.asInstanceOf[List[ConvertFailure]].groupBy(_.path).toList.sortBy(_._1)

    otherFailures.foreach { failure =>
      linesBuffer += descriptionWithOrigin(failure, 0)
    }

    if (otherFailures.nonEmpty && convertFailures.nonEmpty) {
      linesBuffer += ""
    }

    failuresByPath.foreach { case (p, failures) =>
      linesBuffer += (tabs(0) + (if (p.isEmpty) s"at the root:" else s"at '$p':"))
      failures.foreach { failure =>
        linesBuffer += descriptionWithOrigin(failure, 1)
      }
    }
    linesBuffer.mkString(System.lineSeparator())
  }

  override def toString = toList.map(_.toString).mkString("ConfigReaderFailures(", ",", ")")
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy