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

View File

@ -22,9 +22,11 @@ package com.vitorpamplona.quartz.experimental.interactiveStories.tags
import androidx.compose.runtime.Immutable
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.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 +68,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.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
return RootSceneTag(address.kind, address.pubKeyHex, address.dTag, tag.getOrNull(2))
}
@JvmStatic

View File

@ -20,9 +20,11 @@
*/
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.nip46RemoteSigner.getOrNull
import com.vitorpamplona.quartz.utils.arrayOfNotNull
import com.vitorpamplona.quartz.utils.ensure
class StoryOptionTag(
val option: String,
@ -37,10 +39,10 @@ class StoryOptionTag(
@JvmStatic
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
return StoryOptionTag(tag[1], address, tag.getOrNull(3))
}

View File

@ -22,12 +22,14 @@ package com.vitorpamplona.quartz.nip01Core.tags.addressables
import androidx.compose.runtime.Immutable
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.name
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 +112,43 @@ data class ATag(
@JvmStatic
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))
}
@JvmStatic
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()
}
@JvmStatic
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])
}
@JvmStatic
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]
}
@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.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])
}

View File

@ -22,9 +22,11 @@ package com.vitorpamplona.quartz.nip18Reposts.quotes
import androidx.compose.runtime.Immutable
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.utils.arrayOfNotNull
import com.vitorpamplona.quartz.utils.bytesUsedInMemory
import com.vitorpamplona.quartz.utils.ensure
import com.vitorpamplona.quartz.utils.pointerSizeInBytes
@Immutable
@ -61,7 +63,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.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
return QAddressableTag(address, tag.getOrNull(2))
}

View File

@ -23,11 +23,13 @@ package com.vitorpamplona.quartz.nip22Comments.tags
import androidx.compose.runtime.Immutable
import com.vitorpamplona.quartz.nip01Core.core.HexKey
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.valueIfMatches
import com.vitorpamplona.quartz.nip01Core.hints.types.AddressHint
import com.vitorpamplona.quartz.nip01Core.tags.addressables.Address
import com.vitorpamplona.quartz.utils.arrayOfNotNull
import com.vitorpamplona.quartz.utils.ensure
@Immutable
class RootAddressTag(
@ -63,7 +65,9 @@ class RootAddressTag(
@JvmStatic
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()
}

View File

@ -22,10 +22,12 @@ package com.vitorpamplona.quartz.nip89AppHandlers.recommendation.tags
import androidx.compose.runtime.Immutable
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.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 +46,9 @@ class RecommendationTag(
@JvmStatic
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
return RecommendationTag(address, tag.getOrNull(2), tag.getOrNull(3))
}