package {{apiPackage}} import {{modelPackage}}._ import org.json4s._ import scala.reflect.ClassTag object EnumsSerializers { def all = Seq[Serializer[_]](){{#models}}{{#model}}{{#hasEnums}}{{#vars}}{{#isEnum}} :+ new EnumNameSerializer({{classname}}Enums.{{datatypeWithEnum}}){{/isEnum}}{{/vars}}{{/hasEnums}}{{/model}}{{/models}} private class EnumNameSerializer[E <: Enumeration: ClassTag](enum: E) extends Serializer[E#Value] { import JsonDSL._ val EnumerationClass = classOf[E#Value] def deserialize(implicit format: Formats): PartialFunction[(TypeInfo, JValue), E#Value] = { case (t @ TypeInfo(EnumerationClass, _), json) if isValid(json) => { json match { case JString(value) => enum.withName(value) case value => throw new MappingException(s"Can't convert $value to $EnumerationClass") } } } private[this] def isValid(json: JValue) = json match { case JString(value) if enum.values.exists(_.toString == value) => true case _ => false } def serialize(implicit format: Formats): PartialFunction[Any, JValue] = { case i: E#Value => i.toString } } }