aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/firrtl/options/OptionParser.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/firrtl/options/OptionParser.scala')
-rw-r--r--src/main/scala/firrtl/options/OptionParser.scala18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/main/scala/firrtl/options/OptionParser.scala b/src/main/scala/firrtl/options/OptionParser.scala
index 6d8095c0..986c5a8a 100644
--- a/src/main/scala/firrtl/options/OptionParser.scala
+++ b/src/main/scala/firrtl/options/OptionParser.scala
@@ -2,16 +2,28 @@
package firrtl.options
-import firrtl.{FIRRTLException, AnnotationSeq}
+import firrtl.AnnotationSeq
import scopt.OptionParser
-/** Causes an OptionParser to not call exit (call `sys.exit`) if the `--help` option is passed
- */
+case object OptionsHelpException extends Exception("Usage help invoked")
+
+/** OptionParser mixin that causes the OptionParser to not call exit (call `sys.exit`) if the `--help` option is
+ * passed */
trait DoNotTerminateOnExit { this: OptionParser[_] =>
override def terminate(exitState: Either[String, Unit]): Unit = Unit
}
+/** OptionParser mixin that converts to [[OptionsException]]
+ *
+ * Scopt, by default, will print errors to stderr, e.g., invalid arguments will do this. However, a [[Stage]] uses
+ * [[StageUtils.dramaticError]]. By converting this to an [[OptionsException]], a [[Stage]] can then catch the error an
+ * convert it to an [[OptionsException]] that a [[Stage]] can get at.
+ */
+trait ExceptOnError { this: OptionParser[_] =>
+ override def reportError(msg: String): Unit = throw new OptionsException(msg)
+}
+
/** A modified OptionParser with mutable termination and additional checks
*/
trait DuplicateHandling extends OptionParser[AnnotationSeq] {