Simplifying conditionals for the ATag parser

This commit is contained in:
Vitor Pamplona 2025-03-05 15:58:55 -05:00
parent 9adc7a7adf
commit e2459e3fbd
5 changed files with 36 additions and 17 deletions

View File

@ -25,6 +25,7 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.tags.addressables.Address
import com.vitorpamplona.quartz.utils.arrayOfNotNull
import com.vitorpamplona.quartz.utils.bytesUsedInMemory
import com.vitorpamplona.quartz.utils.ensure
import com.vitorpamplona.quartz.utils.pointerSizeInBytes
import com.vitorpamplona.quartz.utils.removeTrailingNullsAndEmptyOthers
@ -66,15 +67,13 @@ data class RootSceneTag(
dTag: String,
) = Address.assemble(kind, pubKeyHex, dTag)
fun parse(
aTagId: String,
relay: String?,
) = Address.parse(aTagId)?.let { RootSceneTag(it.kind, it.pubKeyHex, it.dTag, relay) }
@JvmStatic
fun parse(tag: Array<String>): RootSceneTag? {
if (tag.size < TAG_SIZE || tag[0] != TAG_NAME) return null
return parse(tag[1], tag.getOrNull(2))
ensure(tag.size > 2) { return null }
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

View File

@ -23,6 +23,7 @@ package com.vitorpamplona.quartz.experimental.interactiveStories.tags
import com.vitorpamplona.quartz.nip01Core.tags.addressables.Address
import com.vitorpamplona.quartz.nip46RemoteSigner.getOrNull
import com.vitorpamplona.quartz.utils.arrayOfNotNull
import com.vitorpamplona.quartz.utils.ensure
class StoryOptionTag(
val option: String,
@ -37,10 +38,10 @@ class StoryOptionTag(
@JvmStatic
fun parse(tag: Array<String>): StoryOptionTag? {
if (tag.size < TAG_SIZE || tag[0] != TAG_NAME) return null
ensure(tag.size > 3) { return null }
ensure(tag[0] == TAG_NAME) { return null }
ensure(tag[2].isNotEmpty()) { return null }
val address = Address.parse(tag[2]) ?: return null
return StoryOptionTag(tag[1], address, tag.getOrNull(3))
}

View File

@ -28,6 +28,7 @@ import com.vitorpamplona.quartz.nip01Core.core.value
import com.vitorpamplona.quartz.nip01Core.hints.types.AddressHint
import com.vitorpamplona.quartz.utils.arrayOfNotNull
import com.vitorpamplona.quartz.utils.bytesUsedInMemory
import com.vitorpamplona.quartz.utils.ensure
import com.vitorpamplona.quartz.utils.pointerSizeInBytes
import com.vitorpamplona.quartz.utils.removeTrailingNullsAndEmptyOthers
@ -110,31 +111,43 @@ data class ATag(
@JvmStatic
fun parse(tag: Array<String>): ATag? {
if (tag.size < TAG_SIZE || tag[0] != TAG_NAME) return null
ensure(tag.size > 2) { return null }
ensure(tag[0] == TAG_NAME) { return null }
ensure(tag[1].isNotEmpty()) { return null }
return parse(tag[1], tag.getOrNull(2))
}
@JvmStatic
fun parseValidAddress(tag: Array<String>): String? {
if (tag.size < TAG_SIZE || tag[0] != TAG_NAME) return null
ensure(tag.size > 2) { return null }
ensure(tag[0] == TAG_NAME) { return null }
ensure(tag[1].isNotEmpty()) { return null }
return Address.parse(tag[1])?.toValue()
}
@JvmStatic
fun parseAddress(tag: Array<String>): Address? {
if (tag.size < TAG_SIZE || tag[0] != TAG_NAME) return null
ensure(tag.size > 2) { return null }
ensure(tag[0] == TAG_NAME) { return null }
ensure(tag[1].isNotEmpty()) { return null }
return Address.parse(tag[1])
}
@JvmStatic
fun parseAddressId(tag: Array<String>): String? {
if (tag.size < TAG_SIZE || tag[0] != TAG_NAME) return null
ensure(tag.size > 2) { return null }
ensure(tag[0] == TAG_NAME) { return null }
ensure(tag[1].isNotEmpty()) { return null }
return tag[1]
}
@JvmStatic
fun parseAsHint(tag: Array<String>): AddressHint? {
if (tag.size < 3 || tag[0] != TAG_NAME || !tag[1].contains(':') || tag[2].isEmpty()) return null
ensure(tag.size > 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])
}

View File

@ -25,6 +25,7 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.tags.addressables.Address
import com.vitorpamplona.quartz.utils.arrayOfNotNull
import com.vitorpamplona.quartz.utils.bytesUsedInMemory
import com.vitorpamplona.quartz.utils.ensure
import com.vitorpamplona.quartz.utils.pointerSizeInBytes
@Immutable
@ -61,7 +62,9 @@ data class QAddressableTag(
@JvmStatic
fun parse(tag: Array<String>): QAddressableTag? {
if (tag.size < TAG_SIZE || tag[0] != QTag.TAG_NAME) return null
ensure(tag.size > TAG_SIZE) { return null }
ensure(tag[0] == QTag.TAG_NAME) { return null }
ensure(tag[1].isNotEmpty()) { return null }
val address = Address.parse(tag[1]) ?: return null
return QAddressableTag(address, tag.getOrNull(2))
}

View File

@ -26,6 +26,7 @@ import com.vitorpamplona.quartz.nip01Core.core.match
import com.vitorpamplona.quartz.nip01Core.core.valueIfMatches
import com.vitorpamplona.quartz.nip01Core.tags.addressables.Address
import com.vitorpamplona.quartz.utils.arrayOfNotNull
import com.vitorpamplona.quartz.utils.ensure
@Immutable
class RecommendationTag(
@ -44,7 +45,9 @@ class RecommendationTag(
@JvmStatic
fun parse(tag: Array<String>): RecommendationTag? {
if (tag.size < TAG_SIZE || tag[0] != TAG_NAME) return null
ensure(tag.size > 2) { return null }
ensure(tag[0] == TAG_NAME) { return null }
ensure(tag[1].isNotEmpty()) { return null }
val address = Address.parse(tag[1]) ?: return null
return RecommendationTag(address, tag.getOrNull(2), tag.getOrNull(3))
}