From 6bfea86dbfe478c8b628be481e488de33906aa24 Mon Sep 17 00:00:00 2001 From: "Wesley W. Terpstra" Date: Wed, 6 Sep 2017 15:04:46 -0700 Subject: [PATCH] config: support p.lift(key) to optionally return a value --- src/main/scala/config/Config.scala | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/scala/config/Config.scala b/src/main/scala/config/Config.scala index c7930ee6..8b88829d 100644 --- a/src/main/scala/config/Config.scala +++ b/src/main/scala/config/Config.scala @@ -6,9 +6,14 @@ class Field[T] abstract class View { final def apply[T](pname: Field[T]): T = apply(pname, this) - final def apply[T](pname: Field[T], site: View): T = find(pname, site).asInstanceOf[T] + final def apply[T](pname: Field[T], site: View): T = find(pname, site) match { + case Some(x) => x.asInstanceOf[T] + } - protected[config] def find(pname: Any, site: View): Any + final def lift[T](pname: Field[T]): Option[T] = lift(pname, this) + final def lift[T](pname: Field[T], site: View): Option[T] = find(pname, site).map(_.asInstanceOf[T]) + + protected[config] def find(pname: Any, site: View): Option[Any] } abstract class Parameters extends View { @@ -16,7 +21,7 @@ abstract class Parameters extends View { final def alter(f: (View, View, View) => PartialFunction[Any,Any]): Parameters = Parameters(f) ++ this final def alterPartial(f: PartialFunction[Any,Any]): Parameters = Parameters((_,_,_) => f) ++ this - protected[config] def chain(site: View, tail: View, pname: Any): Any + protected[config] def chain(site: View, tail: View, pname: Any): Option[Any] protected[config] def find(pname: Any, site: View) = chain(site, new TerminalView, pname) } @@ -37,8 +42,7 @@ class Config(p: Parameters) extends Parameters { // Internal implementation: private class TerminalView extends View { - private class Unusable - def find(pname: Any, site: View): Any = pname match { case x: Unusable => () } + def find(pname: Any, site: View): Option[Any] = None } private class ChainView(head: Parameters, tail: View) extends View { @@ -56,6 +60,6 @@ private class EmptyParameters extends Parameters { private class PartialParameters(f: (View, View, View) => PartialFunction[Any,Any]) extends Parameters { protected[config] def chain(site: View, tail: View, pname: Any) = { val g = f(site, this, tail) - if (g.isDefinedAt(pname)) g.apply(pname) else tail.find(pname, site) + if (g.isDefinedAt(pname)) Some(g.apply(pname)) else tail.find(pname, site) } }