package controllers import org.mongodb.scala.{MongoClient,MongoDatabase}; import org.mongodb.scala.bson.codecs.Macros._ import org.mongodb.scala.bson.codecs.DEFAULT_CODEC_REGISTRY; import org.bson.codecs.configuration.CodecRegistries.{fromRegistries, fromProviders, fromCodecs} import org.bson.codecs.{Codec,DecoderContext,EncoderContext} import org.bson.types.ObjectId import org.bson.{BsonWriter,BsonReader} import models._ object MongoDB { private def encoderCodec[T](cls: Class[T]): Codec[T] = new Codec[T] { def decode(reader: BsonReader, decoderContext: DecoderContext): T = throw new UnsupportedOperationException() def encode(writer: BsonWriter, value: T, encoderContext: EncoderContext) = writer.writeString(cls.getSimpleName) def getEncoderClass(): Class[T] = cls } val codecRegistry = fromRegistries( fromProviders(classOf[Food]), fromCodecs(encoderCodec[Mass](classOf[Mass]), encoderCodec[Volume](classOf[Volume]), encoderCodec[Number](classOf[Number]), new Codec[Measure] { def decode(reader: BsonReader, decoderContext: DecoderContext): Measure = reader.readString() match { case "Mass" => Mass() case "Volume" => Volume() case "Number" => Number() case other: String => throw new RuntimeException(s"Did not recognize measure string: $other") } def encode(writer: BsonWriter, value: Measure, encoderContext: EncoderContext) = throw new UnsupportedOperationException() def getEncoderClass(): Class[Measure] = classOf[Measure] }), DEFAULT_CODEC_REGISTRY ) val con: MongoDatabase = MongoClient.apply() .getDatabase("recipes") .withCodecRegistry(MongoDB.codecRegistry) }