Guest User

Untitled

a guest
Aug 14th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.63 KB | None | 0 0
  1. import com.google.gson.JsonDeserializationContext
  2. import com.google.gson.JsonDeserializer
  3. import com.google.gson.JsonElement
  4. import com.google.gson.JsonPrimitive
  5. import com.google.gson.JsonSerializationContext
  6. import com.google.gson.JsonSerializer
  7. import com.moneyforward.android.expenses.extensions.toCamelCase
  8. import com.moneyforward.android.expenses.extensions.toSnakeCase
  9. import java.lang.IllegalArgumentException
  10. import java.lang.reflect.Type
  11.  
  12. class EnumSerializer<T : kotlin.Enum<T>>(
  13. private val unsupportedValue: T,
  14. private val jsonNamingConvention: NamingConvention = NamingConvention.LowerSnakeCase,
  15. private val enumNamingConvention: NamingConvention = NamingConvention.UpperCamelCase
  16. ) : JsonSerializer<T>, JsonDeserializer<T> {
  17. enum class NamingConvention {
  18. UpperSnakeCase,
  19. LowerSnakeCase,
  20. UpperCamelCase,
  21. LowerCamelCase
  22. }
  23.  
  24. override fun deserialize(json: JsonElement?, typeOfT: Type?, context: JsonDeserializationContext?) =
  25. json?.asString?.let {
  26. try {
  27. @Suppress("UNCHECKED_CAST")
  28. java.lang.Enum.valueOf(typeOfT as Class<T>, it.convertNamingConvertion(jsonNamingConvention, enumNamingConvention))
  29. } catch (e: IllegalArgumentException) {
  30. // Unsupported
  31. unsupportedValue
  32. }
  33. } ?: unsupportedValue
  34.  
  35. override fun serialize(src: T, typeOfSrc: Type?, context: JsonSerializationContext?) =
  36. JsonPrimitive(src.name.convertNamingConvertion(enumNamingConvention, jsonNamingConvention))
  37.  
  38. private fun String.convertNamingConvertion(from: NamingConvention, to: NamingConvention): String {
  39. if (from == to || length <= 0) return this
  40.  
  41. return when (from) {
  42. NamingConvention.UpperSnakeCase, NamingConvention.LowerSnakeCase ->
  43. when (to) {
  44. NamingConvention.UpperSnakeCase -> toUpperCase()
  45. NamingConvention.LowerSnakeCase -> toLowerCase()
  46. NamingConvention.UpperCamelCase -> toCamelCase(false)
  47. NamingConvention.LowerCamelCase -> toCamelCase(true)
  48. }
  49. NamingConvention.UpperCamelCase, NamingConvention.LowerCamelCase ->
  50. when (to) {
  51. NamingConvention.UpperSnakeCase -> toSnakeCase(false)
  52. NamingConvention.LowerSnakeCase -> toSnakeCase(true)
  53. NamingConvention.UpperCamelCase -> get(0).toLowerCase() + substring(1)
  54. NamingConvention.LowerCamelCase -> get(0).toUpperCase() + substring(1)
  55. }
  56. }
  57. }
  58. }
Add Comment
Please, Sign In to add comment