Simplifying conditionals for the ATag parser

This commit is contained in:
Vitor Pamplona
2025-03-05 15:58:55 -05:00
parent 9adc7a7adf
commit f4d06eee6d
6 changed files with 46 additions and 18 deletions
@@ -22,9 +22,11 @@ package com.vitorpamplona.quartz.experimental.interactiveStories.tags
import androidx.compose.runtime.Immutable import androidx.compose.runtime.Immutable
import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.has
import com.vitorpamplona.quartz.nip01Core.tags.addressables.Address import com.vitorpamplona.quartz.nip01Core.tags.addressables.Address
import com.vitorpamplona.quartz.utils.arrayOfNotNull import com.vitorpamplona.quartz.utils.arrayOfNotNull
import com.vitorpamplona.quartz.utils.bytesUsedInMemory import com.vitorpamplona.quartz.utils.bytesUsedInMemory
import com.vitorpamplona.quartz.utils.ensure
import com.vitorpamplona.quartz.utils.pointerSizeInBytes import com.vitorpamplona.quartz.utils.pointerSizeInBytes
import com.vitorpamplona.quartz.utils.removeTrailingNullsAndEmptyOthers import com.vitorpamplona.quartz.utils.removeTrailingNullsAndEmptyOthers
@@ -66,15 +68,13 @@ data class RootSceneTag(
dTag: String, dTag: String,
) = Address.assemble(kind, pubKeyHex, dTag) ) = Address.assemble(kind, pubKeyHex, dTag)
fun parse(
aTagId: String,
relay: String?,
) = Address.parse(aTagId)?.let { RootSceneTag(it.kind, it.pubKeyHex, it.dTag, relay) }
@JvmStatic @JvmStatic
fun parse(tag: Array<String>): RootSceneTag? { fun parse(tag: Array<String>): RootSceneTag? {
if (tag.size < TAG_SIZE || tag[0] != TAG_NAME) return null ensure(tag.has(1)) { return null }
return parse(tag[1], tag.getOrNull(2)) ensure(tag[0] == TAG_NAME) { return null }
ensure(tag[1].isNotEmpty()) { return null }
val address = Address.parse(tag[1]) ?: return null
return RootSceneTag(address.kind, address.pubKeyHex, address.dTag, tag.getOrNull(2))
} }
@JvmStatic @JvmStatic
@@ -20,9 +20,11 @@
*/ */
package com.vitorpamplona.quartz.experimental.interactiveStories.tags package com.vitorpamplona.quartz.experimental.interactiveStories.tags
import com.vitorpamplona.quartz.nip01Core.core.has
import com.vitorpamplona.quartz.nip01Core.tags.addressables.Address import com.vitorpamplona.quartz.nip01Core.tags.addressables.Address
import com.vitorpamplona.quartz.nip46RemoteSigner.getOrNull import com.vitorpamplona.quartz.nip46RemoteSigner.getOrNull
import com.vitorpamplona.quartz.utils.arrayOfNotNull import com.vitorpamplona.quartz.utils.arrayOfNotNull
import com.vitorpamplona.quartz.utils.ensure
class StoryOptionTag( class StoryOptionTag(
val option: String, val option: String,
@@ -37,10 +39,10 @@ class StoryOptionTag(
@JvmStatic @JvmStatic
fun parse(tag: Array<String>): StoryOptionTag? { fun parse(tag: Array<String>): StoryOptionTag? {
if (tag.size < TAG_SIZE || tag[0] != TAG_NAME) return null ensure(tag.has(2)) { return null }
ensure(tag[0] == TAG_NAME) { return null }
ensure(tag[2].isNotEmpty()) { return null }
val address = Address.parse(tag[2]) ?: return null val address = Address.parse(tag[2]) ?: return null
return StoryOptionTag(tag[1], address, tag.getOrNull(3)) return StoryOptionTag(tag[1], address, tag.getOrNull(3))
} }
@@ -22,12 +22,14 @@ package com.vitorpamplona.quartz.nip01Core.tags.addressables
import androidx.compose.runtime.Immutable import androidx.compose.runtime.Immutable
import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.has
import com.vitorpamplona.quartz.nip01Core.core.match import com.vitorpamplona.quartz.nip01Core.core.match
import com.vitorpamplona.quartz.nip01Core.core.name import com.vitorpamplona.quartz.nip01Core.core.name
import com.vitorpamplona.quartz.nip01Core.core.value import com.vitorpamplona.quartz.nip01Core.core.value
import com.vitorpamplona.quartz.nip01Core.hints.types.AddressHint import com.vitorpamplona.quartz.nip01Core.hints.types.AddressHint
import com.vitorpamplona.quartz.utils.arrayOfNotNull import com.vitorpamplona.quartz.utils.arrayOfNotNull
import com.vitorpamplona.quartz.utils.bytesUsedInMemory import com.vitorpamplona.quartz.utils.bytesUsedInMemory
import com.vitorpamplona.quartz.utils.ensure
import com.vitorpamplona.quartz.utils.pointerSizeInBytes import com.vitorpamplona.quartz.utils.pointerSizeInBytes
import com.vitorpamplona.quartz.utils.removeTrailingNullsAndEmptyOthers import com.vitorpamplona.quartz.utils.removeTrailingNullsAndEmptyOthers
@@ -110,31 +112,43 @@ data class ATag(
@JvmStatic @JvmStatic
fun parse(tag: Array<String>): ATag? { fun parse(tag: Array<String>): ATag? {
if (tag.size < TAG_SIZE || tag[0] != TAG_NAME) return null ensure(tag.has(1)) { return null }
ensure(tag[0] == TAG_NAME) { return null }
ensure(tag[1].isNotEmpty()) { return null }
return parse(tag[1], tag.getOrNull(2)) return parse(tag[1], tag.getOrNull(2))
} }
@JvmStatic @JvmStatic
fun parseValidAddress(tag: Array<String>): String? { fun parseValidAddress(tag: Array<String>): String? {
if (tag.size < TAG_SIZE || tag[0] != TAG_NAME) return null ensure(tag.has(1)) { return null }
ensure(tag[0] == TAG_NAME) { return null }
ensure(tag[1].isNotEmpty()) { return null }
return Address.parse(tag[1])?.toValue() return Address.parse(tag[1])?.toValue()
} }
@JvmStatic @JvmStatic
fun parseAddress(tag: Array<String>): Address? { fun parseAddress(tag: Array<String>): Address? {
if (tag.size < TAG_SIZE || tag[0] != TAG_NAME) return null ensure(tag.has(1)) { return null }
ensure(tag[0] == TAG_NAME) { return null }
ensure(tag[1].isNotEmpty()) { return null }
return Address.parse(tag[1]) return Address.parse(tag[1])
} }
@JvmStatic @JvmStatic
fun parseAddressId(tag: Array<String>): String? { fun parseAddressId(tag: Array<String>): String? {
if (tag.size < TAG_SIZE || tag[0] != TAG_NAME) return null ensure(tag.has(1)) { return null }
ensure(tag[0] == TAG_NAME) { return null }
ensure(tag[1].isNotEmpty()) { return null }
return tag[1] return tag[1]
} }
@JvmStatic @JvmStatic
fun parseAsHint(tag: Array<String>): AddressHint? { fun parseAsHint(tag: Array<String>): AddressHint? {
if (tag.size < 3 || tag[0] != TAG_NAME || !tag[1].contains(':') || tag[2].isEmpty()) return null ensure(tag.has(2)) { return null }
ensure(tag[0] == TAG_NAME) { return null }
ensure(tag[1].isNotEmpty()) { return null }
ensure(tag[1].contains(':')) { return null }
ensure(tag[2].isNotEmpty()) { return null }
return AddressHint(tag[1], tag[2]) return AddressHint(tag[1], tag[2])
} }
@@ -22,9 +22,11 @@ package com.vitorpamplona.quartz.nip18Reposts.quotes
import androidx.compose.runtime.Immutable import androidx.compose.runtime.Immutable
import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.has
import com.vitorpamplona.quartz.nip01Core.tags.addressables.Address import com.vitorpamplona.quartz.nip01Core.tags.addressables.Address
import com.vitorpamplona.quartz.utils.arrayOfNotNull import com.vitorpamplona.quartz.utils.arrayOfNotNull
import com.vitorpamplona.quartz.utils.bytesUsedInMemory import com.vitorpamplona.quartz.utils.bytesUsedInMemory
import com.vitorpamplona.quartz.utils.ensure
import com.vitorpamplona.quartz.utils.pointerSizeInBytes import com.vitorpamplona.quartz.utils.pointerSizeInBytes
@Immutable @Immutable
@@ -61,7 +63,9 @@ data class QAddressableTag(
@JvmStatic @JvmStatic
fun parse(tag: Array<String>): QAddressableTag? { fun parse(tag: Array<String>): QAddressableTag? {
if (tag.size < TAG_SIZE || tag[0] != QTag.TAG_NAME) return null ensure(tag.has(1)) { return null }
ensure(tag[0] == QTag.TAG_NAME) { return null }
ensure(tag[1].isNotEmpty()) { return null }
val address = Address.parse(tag[1]) ?: return null val address = Address.parse(tag[1]) ?: return null
return QAddressableTag(address, tag.getOrNull(2)) return QAddressableTag(address, tag.getOrNull(2))
} }
@@ -23,11 +23,13 @@ package com.vitorpamplona.quartz.nip22Comments.tags
import androidx.compose.runtime.Immutable import androidx.compose.runtime.Immutable
import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.Tag import com.vitorpamplona.quartz.nip01Core.core.Tag
import com.vitorpamplona.quartz.nip01Core.core.has
import com.vitorpamplona.quartz.nip01Core.core.match import com.vitorpamplona.quartz.nip01Core.core.match
import com.vitorpamplona.quartz.nip01Core.core.valueIfMatches import com.vitorpamplona.quartz.nip01Core.core.valueIfMatches
import com.vitorpamplona.quartz.nip01Core.hints.types.AddressHint import com.vitorpamplona.quartz.nip01Core.hints.types.AddressHint
import com.vitorpamplona.quartz.nip01Core.tags.addressables.Address import com.vitorpamplona.quartz.nip01Core.tags.addressables.Address
import com.vitorpamplona.quartz.utils.arrayOfNotNull import com.vitorpamplona.quartz.utils.arrayOfNotNull
import com.vitorpamplona.quartz.utils.ensure
@Immutable @Immutable
class RootAddressTag( class RootAddressTag(
@@ -63,7 +65,9 @@ class RootAddressTag(
@JvmStatic @JvmStatic
fun parseValidAddress(tag: Array<String>): String? { fun parseValidAddress(tag: Array<String>): String? {
if (tag.size < TAG_SIZE || tag[0] != TAG_NAME) return null ensure(tag.has(1)) { return null }
ensure(tag[0] == TAG_NAME) { return null }
ensure(tag[1].isNotEmpty()) { return null }
return Address.parse(tag[1])?.toValue() return Address.parse(tag[1])?.toValue()
} }
@@ -22,10 +22,12 @@ package com.vitorpamplona.quartz.nip89AppHandlers.recommendation.tags
import androidx.compose.runtime.Immutable import androidx.compose.runtime.Immutable
import com.vitorpamplona.quartz.nip01Core.core.Tag import com.vitorpamplona.quartz.nip01Core.core.Tag
import com.vitorpamplona.quartz.nip01Core.core.has
import com.vitorpamplona.quartz.nip01Core.core.match import com.vitorpamplona.quartz.nip01Core.core.match
import com.vitorpamplona.quartz.nip01Core.core.valueIfMatches import com.vitorpamplona.quartz.nip01Core.core.valueIfMatches
import com.vitorpamplona.quartz.nip01Core.tags.addressables.Address import com.vitorpamplona.quartz.nip01Core.tags.addressables.Address
import com.vitorpamplona.quartz.utils.arrayOfNotNull import com.vitorpamplona.quartz.utils.arrayOfNotNull
import com.vitorpamplona.quartz.utils.ensure
@Immutable @Immutable
class RecommendationTag( class RecommendationTag(
@@ -44,7 +46,9 @@ class RecommendationTag(
@JvmStatic @JvmStatic
fun parse(tag: Array<String>): RecommendationTag? { fun parse(tag: Array<String>): RecommendationTag? {
if (tag.size < TAG_SIZE || tag[0] != TAG_NAME) return null ensure(tag.has(1)) { return null }
ensure(tag[0] == TAG_NAME) { return null }
ensure(tag[1].isNotEmpty()) { return null }
val address = Address.parse(tag[1]) ?: return null val address = Address.parse(tag[1]) ?: return null
return RecommendationTag(address, tag.getOrNull(2), tag.getOrNull(3)) return RecommendationTag(address, tag.getOrNull(2), tag.getOrNull(3))
} }