Prepares a BSONReader that transforms the input BSON value, using the given f function, before passing the transformed BSON value to the current reader.
Prepares a BSONReader that transforms the input BSON value, using the given f function, before passing the transformed BSON value to the current reader.
import reactivemongo.api.bson.{
BSONReader, BSONInteger, BSONNull, BSONString
}
val normalizingReader: BSONReader[Int] =
implicitly[BSONReader[Int]].beforeRead {
case BSONNull => BSONInteger(-1)
case BSONString(s) => BSONInteger(s.size)
// other values are unchanged
}
normalizingReader.readOpt(BSONNull) // Some(-1)
normalizingReader.readTry(BSONString("foo")) // Success(3)
normalizingReader.readOpt(BSONInteger(4)) // unchanged: Some(4)
Prepares a BSONReader that transforms the input BSON value, using the given f function, before passing the transformed BSON value to the current reader.
Prepares a BSONReader that transforms the input BSON value, using the given f function, before passing the transformed BSON value to the current reader.
Prepares a BSONReader that returns the result of applying f
on the result of this reader.
Prepares a BSONReader that returns the result of applying f
on the result of this reader.
import scala.util.Try
import reactivemongo.api.bson.{ BSONReader, BSONValue }
// Try to return an integer + 1,
// from any T that can be read from BSON
// and is a numeric type
def fromBSON[T](bson: BSONValue)(
implicit r: BSONReader[T], n: Numeric[T]): Try[Int] = {
val r2: BSONReader[Int] = r.afterRead { v => n.toInt(v) + 1 }
r2.readTry(bson)
}