diff --git a/ktx/README.md b/ktx/README.md index c0f76c4a3..5068602d9 100644 --- a/ktx/README.md +++ b/ktx/README.md @@ -65,6 +65,7 @@ class Cat : ParseObject() { class Cat : ParseObject() { var name: String by stringAttribute() // That's it + var legs: Int by intAttribute("cat-legs") } ``` diff --git a/ktx/src/main/java/com/parse/ktx/delegates/BooleanParseDelegate.kt b/ktx/src/main/java/com/parse/ktx/delegates/BooleanParseDelegate.kt index d2ad8b5ed..9a4721105 100644 --- a/ktx/src/main/java/com/parse/ktx/delegates/BooleanParseDelegate.kt +++ b/ktx/src/main/java/com/parse/ktx/delegates/BooleanParseDelegate.kt @@ -8,14 +8,14 @@ import kotlin.reflect.KProperty /** * A [Boolean] property delegation for [ParseObject]. */ -class BooleanParseDelegate { +class BooleanParseDelegate(private val name: String?) { operator fun getValue(parseObject: ParseObject, property: KProperty<*>): Boolean { - return parseObject.getBoolean(property.name) + return parseObject.getBoolean(name ?: property.name) } operator fun setValue(parseObject: ParseObject, property: KProperty<*>, value: Boolean) { - parseObject.put(property.name, value) + parseObject.put(name ?: property.name, value) } } @@ -24,4 +24,4 @@ class BooleanParseDelegate { * Returns a [Boolean] property delegate for [ParseObject]s. This uses [ParseObject.getBoolean] * and [ParseObject.put]. */ -inline fun booleanAttribute() = BooleanParseDelegate() +inline fun booleanAttribute(name: String? = null) = BooleanParseDelegate(name) diff --git a/ktx/src/main/java/com/parse/ktx/delegates/BytesParseDelegate.kt b/ktx/src/main/java/com/parse/ktx/delegates/BytesParseDelegate.kt index 6e2918ba9..d611980d9 100644 --- a/ktx/src/main/java/com/parse/ktx/delegates/BytesParseDelegate.kt +++ b/ktx/src/main/java/com/parse/ktx/delegates/BytesParseDelegate.kt @@ -9,14 +9,14 @@ import kotlin.reflect.KProperty /** * A [ByteArray] property delegation for [ParseObject]. */ -class BytesParseDelegate { +class BytesParseDelegate(private val name: String?) { operator fun getValue(parseObject: ParseObject, property: KProperty<*>): ByteArray? { - return parseObject.getBytes(property.name) + return parseObject.getBytes(name ?: property.name) } operator fun setValue(parseObject: ParseObject, property: KProperty<*>, value: ByteArray?) { - parseObject.putOrIgnore(property.name, value) + parseObject.putOrIgnore(name ?:property.name, value) } } @@ -25,4 +25,4 @@ class BytesParseDelegate { * Returns a [ByteArray] property delegate for [ParseObject]s. This uses [ParseObject.getBytes] * and [ParseObject.putOrIgnore]. */ -inline fun bytesAttribute() = BytesParseDelegate() +inline fun bytesAttribute(name: String? = null) = BytesParseDelegate(name) diff --git a/ktx/src/main/java/com/parse/ktx/delegates/DoubleParseDelegate.kt b/ktx/src/main/java/com/parse/ktx/delegates/DoubleParseDelegate.kt index 312964ae3..964e732de 100644 --- a/ktx/src/main/java/com/parse/ktx/delegates/DoubleParseDelegate.kt +++ b/ktx/src/main/java/com/parse/ktx/delegates/DoubleParseDelegate.kt @@ -8,14 +8,14 @@ import kotlin.reflect.KProperty /** * A [Double] property delegation for [ParseObject]. */ -class DoubleParseDelegate { +class DoubleParseDelegate(private val name: String?) { operator fun getValue(parseObject: ParseObject, property: KProperty<*>): Double { - return parseObject.getDouble(property.name) + return parseObject.getDouble(name ?: property.name) } operator fun setValue(parseObject: ParseObject, property: KProperty<*>, value: Double) { - parseObject.put(property.name, value) + parseObject.put(name ?: property.name, value) } } @@ -24,4 +24,4 @@ class DoubleParseDelegate { * Returns a [Double] property delegate for [ParseObject]s. This uses [ParseObject.getDouble] * and [ParseObject.put]. */ -inline fun doubleAttribute() = DoubleParseDelegate() +inline fun doubleAttribute(name: String? = null) = DoubleParseDelegate(name) diff --git a/ktx/src/main/java/com/parse/ktx/delegates/EnumParseDelegate.kt b/ktx/src/main/java/com/parse/ktx/delegates/EnumParseDelegate.kt index db0d1ac80..44a17f159 100644 --- a/ktx/src/main/java/com/parse/ktx/delegates/EnumParseDelegate.kt +++ b/ktx/src/main/java/com/parse/ktx/delegates/EnumParseDelegate.kt @@ -11,18 +11,22 @@ import kotlin.reflect.KProperty * This implementation save enum's name in lower case on parse-server and when try retrieve it * convert again to upper case to find correspondent local enum. */ -class EnumParseDelegate>(private val default: T?, private val enumClass: Class) { +class EnumParseDelegate>( + private val name: String?, + private val default: T?, + private val enumClass: Class +) { operator fun getValue(parseObject: ParseObject, property: KProperty<*>): T { return try { - java.lang.Enum.valueOf(enumClass, parseObject.getString(property.name)!!.toUpperCase()) + java.lang.Enum.valueOf(enumClass, parseObject.getString(name ?: property.name)!!.toUpperCase()) } catch (e: Exception) { default ?: throw e } } operator fun setValue(parseObject: ParseObject, property: KProperty<*>, t: T) { - parseObject.put(property.name, t.name.toLowerCase()) + parseObject.put(name ?: property.name, t.name.toLowerCase()) } } @@ -31,4 +35,10 @@ class EnumParseDelegate>(private val default: T?, private val enumCl * Returns a [Enum] property delegate for [ParseObject]s. This uses custom implementation for get * to retrieve a local version of the your enum and [ParseObject.put]. */ -inline fun > enumAttribute(default: T? = null) = EnumParseDelegate(default, T::class.java) +inline fun > enumAttribute(default: T? = null) = EnumParseDelegate(null, default, T::class.java) + +/** + * Returns a [Enum] property delegate for [ParseObject]s. This uses custom implementation for get + * to retrieve a local version of the your enum and [ParseObject.put]. + */ +inline fun > enumAttribute(name: String? = null, default: T? = null) = EnumParseDelegate(name, default, T::class.java) diff --git a/ktx/src/main/java/com/parse/ktx/delegates/FloatParseDelegate.kt b/ktx/src/main/java/com/parse/ktx/delegates/FloatParseDelegate.kt index 567924efb..0a88b0690 100644 --- a/ktx/src/main/java/com/parse/ktx/delegates/FloatParseDelegate.kt +++ b/ktx/src/main/java/com/parse/ktx/delegates/FloatParseDelegate.kt @@ -8,14 +8,14 @@ import kotlin.reflect.KProperty /** * A [Float] property delegation for [ParseObject]. */ -class FloatParseDelegate { +class FloatParseDelegate(private val name: String?) { operator fun getValue(parseObject: ParseObject, property: KProperty<*>): Float { - return parseObject.getDouble(property.name).toFloat() + return parseObject.getDouble(name ?: property.name).toFloat() } operator fun setValue(parseObject: ParseObject, property: KProperty<*>, value: Float) { - parseObject.put(property.name, value) + parseObject.put(name ?: property.name, value) } } @@ -24,4 +24,4 @@ class FloatParseDelegate { * Returns a [Float] property delegate for [ParseObject]s. This uses a custom implementation for get * and [ParseObject.put]. */ -inline fun floatAttribute() = FloatParseDelegate() +inline fun floatAttribute(name: String? = null) = FloatParseDelegate(name) diff --git a/ktx/src/main/java/com/parse/ktx/delegates/IntParseDelegate.kt b/ktx/src/main/java/com/parse/ktx/delegates/IntParseDelegate.kt index 1cc86797d..06d9a102e 100644 --- a/ktx/src/main/java/com/parse/ktx/delegates/IntParseDelegate.kt +++ b/ktx/src/main/java/com/parse/ktx/delegates/IntParseDelegate.kt @@ -8,14 +8,14 @@ import kotlin.reflect.KProperty /** * A [Int] property delegation for [ParseObject]. */ -class IntParseDelegate { +class IntParseDelegate(private val name: String?) { operator fun getValue(parseObject: ParseObject, property: KProperty<*>): Int { - return parseObject.getInt(property.name) + return parseObject.getInt(name ?: property.name) } operator fun setValue(parseObject: ParseObject, property: KProperty<*>, value: Int) { - parseObject.put(property.name, value) + parseObject.put(name ?:property.name, value) } } @@ -24,4 +24,4 @@ class IntParseDelegate { * Returns a [Int] property delegate for [ParseObject]s. This uses [ParseObject.getInt] * and [ParseObject.put]. */ -inline fun intAttribute() = IntParseDelegate() +inline fun intAttribute(name: String? = null) = IntParseDelegate(name) diff --git a/ktx/src/main/java/com/parse/ktx/delegates/JsonArrayParseDelegate.kt b/ktx/src/main/java/com/parse/ktx/delegates/JsonArrayParseDelegate.kt index 383e84f2a..f19884504 100644 --- a/ktx/src/main/java/com/parse/ktx/delegates/JsonArrayParseDelegate.kt +++ b/ktx/src/main/java/com/parse/ktx/delegates/JsonArrayParseDelegate.kt @@ -10,14 +10,14 @@ import kotlin.reflect.KProperty /** * A [JSONArray] property delegation for [ParseObject]. */ -class JsonArrayParseDelegate { +class JsonArrayParseDelegate(private val name: String?) { operator fun getValue(parseObject: ParseObject, property: KProperty<*>): JSONArray? { - return parseObject.getJSONArray(property.name) + return parseObject.getJSONArray(name ?: property.name) } operator fun setValue(parseObject: ParseObject, property: KProperty<*>, value: JSONArray?) { - parseObject.putOrIgnore(property.name, value) + parseObject.putOrIgnore(name ?: property.name, value) } } @@ -26,4 +26,4 @@ class JsonArrayParseDelegate { * Returns a [JSONArray] property delegate for [ParseObject]s. This uses [ParseObject.getDouble] * and [ParseObject.putOrIgnore]. */ -inline fun jsonArrayAttribute() = JsonArrayParseDelegate() +inline fun jsonArrayAttribute(name: String? = null) = JsonArrayParseDelegate(name) diff --git a/ktx/src/main/java/com/parse/ktx/delegates/JsonObjectParseDelegate.kt b/ktx/src/main/java/com/parse/ktx/delegates/JsonObjectParseDelegate.kt index 7e46dd2aa..f690decc0 100644 --- a/ktx/src/main/java/com/parse/ktx/delegates/JsonObjectParseDelegate.kt +++ b/ktx/src/main/java/com/parse/ktx/delegates/JsonObjectParseDelegate.kt @@ -10,14 +10,14 @@ import kotlin.reflect.KProperty /** * A [JSONObject] property delegation for [ParseObject]. */ -class JsonObjectParseDelegate { +class JsonObjectParseDelegate(private val name: String?) { operator fun getValue(parseObject: ParseObject, property: KProperty<*>): JSONObject? { - return parseObject.getJSONObject(property.name) + return parseObject.getJSONObject(name ?: property.name) } operator fun setValue(parseObject: ParseObject, property: KProperty<*>, value: JSONObject?) { - parseObject.putOrIgnore(property.name, value) + parseObject.putOrIgnore(name ?: property.name, value) } } @@ -26,4 +26,4 @@ class JsonObjectParseDelegate { * Returns a [JSONObject] property delegate for [ParseObject]s. This uses [ParseObject.getJSONObject] * and [ParseObject.putOrIgnore]. */ -fun jsonObjectAttribute() = JsonObjectParseDelegate() +fun jsonObjectAttribute(name: String? = null) = JsonObjectParseDelegate(name) diff --git a/ktx/src/main/java/com/parse/ktx/delegates/ListParseDelegate.kt b/ktx/src/main/java/com/parse/ktx/delegates/ListParseDelegate.kt index b99c20d03..e0d0939bd 100644 --- a/ktx/src/main/java/com/parse/ktx/delegates/ListParseDelegate.kt +++ b/ktx/src/main/java/com/parse/ktx/delegates/ListParseDelegate.kt @@ -9,14 +9,14 @@ import kotlin.reflect.KProperty /** * A [List] property delegation for [ParseObject]. */ -class ListParseDelegate { +class ListParseDelegate(private val name: String?) { operator fun getValue(parseObject: ParseObject, property: KProperty<*>): MutableList? { - return parseObject.getList(property.name) as? MutableList + return parseObject.getList(name ?: property.name) as? MutableList } operator fun setValue(parseObject: ParseObject, property: KProperty<*>, value: MutableList?) { - parseObject.putOrIgnore(property.name, value) + parseObject.putOrIgnore(name ?: property.name, value) } } @@ -25,4 +25,4 @@ class ListParseDelegate { * Returns a [List] property delegate for [ParseObject]s. This uses [ParseObject.getList] * and [ParseObject.putOrIgnore]. */ -inline fun listAttribute() = ListParseDelegate() +inline fun listAttribute(name: String? = null) = ListParseDelegate(null) diff --git a/ktx/src/main/java/com/parse/ktx/delegates/LongParseDelegate.kt b/ktx/src/main/java/com/parse/ktx/delegates/LongParseDelegate.kt index 59d82c497..cc584bb7c 100644 --- a/ktx/src/main/java/com/parse/ktx/delegates/LongParseDelegate.kt +++ b/ktx/src/main/java/com/parse/ktx/delegates/LongParseDelegate.kt @@ -8,14 +8,14 @@ import kotlin.reflect.KProperty /** * A [Long] property delegation for [ParseObject]. */ -class LongParseDelegate { +class LongParseDelegate(private val name: String?) { operator fun getValue(parseObject: ParseObject, property: KProperty<*>): Long { - return parseObject.getLong(property.name) + return parseObject.getLong(name ?: property.name) } operator fun setValue(parseObject: ParseObject, property: KProperty<*>, value: Long) { - parseObject.put(property.name, value) + parseObject.put(name ?: property.name, value) } } @@ -24,4 +24,4 @@ class LongParseDelegate { * Returns a [Long] property delegate for [ParseObject]s. This uses [ParseObject.getLong] * and [ParseObject.put]. */ -inline fun longAttribute() = LongParseDelegate() +inline fun longAttribute(name: String? = null) = LongParseDelegate(name) diff --git a/ktx/src/main/java/com/parse/ktx/delegates/MapParseDelegate.kt b/ktx/src/main/java/com/parse/ktx/delegates/MapParseDelegate.kt index 1794ba589..046118dd3 100644 --- a/ktx/src/main/java/com/parse/ktx/delegates/MapParseDelegate.kt +++ b/ktx/src/main/java/com/parse/ktx/delegates/MapParseDelegate.kt @@ -9,14 +9,14 @@ import kotlin.reflect.KProperty /** * A [Map] property delegation for [ParseObject]. */ -class MapParseDelegate { +class MapParseDelegate(private val name: String?) { operator fun getValue(parseObject: ParseObject, property: KProperty<*>): MutableMap? { - return parseObject.getMap(property.name) as? MutableMap + return parseObject.getMap(name ?: property.name) as? MutableMap } operator fun setValue(parseObject: ParseObject, property: KProperty<*>, value: MutableMap?) { - parseObject.putOrIgnore(property.name, value) + parseObject.putOrIgnore(name ?: property.name, value) } } @@ -25,4 +25,4 @@ class MapParseDelegate { * Returns a [Map] property delegate for [ParseObject]s. This uses [ParseObject.getMap] * and [ParseObject.putOrIgnore]. */ -inline fun mapAttribute() = MapParseDelegate() +inline fun mapAttribute(name: String? = null) = MapParseDelegate(name) diff --git a/ktx/src/main/java/com/parse/ktx/delegates/ParseDelegate.kt b/ktx/src/main/java/com/parse/ktx/delegates/ParseDelegate.kt index 1fd5a984a..1807ed64a 100644 --- a/ktx/src/main/java/com/parse/ktx/delegates/ParseDelegate.kt +++ b/ktx/src/main/java/com/parse/ktx/delegates/ParseDelegate.kt @@ -10,15 +10,15 @@ import kotlin.reflect.KProperty /** * A generic property delegation for [ParseObject]. */ -class ParseDelegate { +class ParseDelegate(private val name: String?) { @Suppress("UNCHECKED_CAST") operator fun getValue(parseObject: ParseObject, property: KProperty<*>): T { - return parseObject.getAs(property.name) + return parseObject.getAs(name ?: property.name) } operator fun setValue(parseObject: ParseObject, property: KProperty<*>, value: T) { - parseObject.putOrIgnore(property.name, value) + parseObject.putOrIgnore(name ?: property.name, value) } } @@ -27,4 +27,4 @@ class ParseDelegate { * Returns a generic property delegate for [ParseObject]s. This uses [ParseObject.getAs] * and [ParseObject.putOrIgnore]. */ -inline fun attribute() = ParseDelegate() +inline fun attribute(name: String? = null) = ParseDelegate(name) diff --git a/ktx/src/main/java/com/parse/ktx/delegates/ParseRelationDelegate.kt b/ktx/src/main/java/com/parse/ktx/delegates/ParseRelationDelegate.kt index 222802499..2529fc33a 100644 --- a/ktx/src/main/java/com/parse/ktx/delegates/ParseRelationDelegate.kt +++ b/ktx/src/main/java/com/parse/ktx/delegates/ParseRelationDelegate.kt @@ -9,10 +9,10 @@ import kotlin.reflect.KProperty /** * A [ParseRelation] property delegation for [ParseObject]. */ -class ParseRelationDelegate { +class ParseRelationDelegate(private val name: String?) { operator fun getValue(parseObject: ParseObject, property: KProperty<*>): ParseRelation { - return parseObject.getRelation(property.name) + return parseObject.getRelation(name ?: property.name) } } @@ -21,4 +21,4 @@ class ParseRelationDelegate { * Returns a [ParseRelation] property delegate for [ParseObject]s. * This uses [ParseObject.getRelation]. */ -inline fun relationAttribute() = ParseRelationDelegate() +inline fun relationAttribute(name: String? = null) = ParseRelationDelegate(name) diff --git a/ktx/src/main/java/com/parse/ktx/delegates/SafeParseDelegate.kt b/ktx/src/main/java/com/parse/ktx/delegates/SafeParseDelegate.kt index 3cadd7bb1..7863265b7 100644 --- a/ktx/src/main/java/com/parse/ktx/delegates/SafeParseDelegate.kt +++ b/ktx/src/main/java/com/parse/ktx/delegates/SafeParseDelegate.kt @@ -11,12 +11,13 @@ import kotlin.reflect.KProperty * A generic property delegation for [ParseObject], and give some checks to avoid throw some * exceptions. */ -class SafeParseDelegate { +class SafeParseDelegate(private val name: String?) { @Suppress("UNCHECKED_CAST") operator fun getValue(parseObject: ParseObject, property: KProperty<*>): T? { - val value = if (parseObject.has(property.name)) { - parseObject.get(property.name) + val name = name ?: property.name + val value = if (parseObject.has(name)) { + parseObject.get(name) } else { null } @@ -37,4 +38,4 @@ class SafeParseDelegate { * Returns a generic property delegate for [ParseObject]s. This uses a custom get implementation * and [ParseObject.putOrRemove]. */ -inline fun safeAttribute() = SafeParseDelegate() +inline fun safeAttribute(name: String? = null) = SafeParseDelegate(name) diff --git a/ktx/src/main/java/com/parse/ktx/delegates/StringParseDelegate.kt b/ktx/src/main/java/com/parse/ktx/delegates/StringParseDelegate.kt index 2b2ac652f..8eb3cfa61 100644 --- a/ktx/src/main/java/com/parse/ktx/delegates/StringParseDelegate.kt +++ b/ktx/src/main/java/com/parse/ktx/delegates/StringParseDelegate.kt @@ -9,15 +9,18 @@ import kotlin.reflect.KProperty /** * A [String] property delegation for [ParseObject]. */ -class StringParseDelegate(private val filter: (String) -> String) { +class StringParseDelegate( + private val name: String?, + private val filter: (String) -> String +) { operator fun getValue(parseObject: ParseObject, property: KProperty<*>): S { - return parseObject.getAs(property.name) + return parseObject.getAs(name ?: property.name) } operator fun setValue(parseObject: ParseObject, property: KProperty<*>, value: S) { if (value != null) { - parseObject.put(property.name, filter.invoke(value)) + parseObject.put(name ?: property.name, filter.invoke(value)) } } @@ -28,13 +31,15 @@ class StringParseDelegate(private val filter: (String) -> String) { * and a custom implementation for set. */ inline fun nullableStringAttribute( + name: String? = null, noinline filter: (String) -> String = { it } -) = StringParseDelegate(filter) +) = StringParseDelegate(name, filter) /** * Returns a [String] property delegate for [ParseObject]s. This uses [ParseObject.getAs] * and a custom implementation for set. */ inline fun stringAttribute( + name: String? = null, noinline filter: (String) -> String = { it } -) = StringParseDelegate(filter) +) = StringParseDelegate(name, filter)