Coverage Summary for Class: HeaderMatcherSerializer (dev.skymansandy.wiretap.helper.util)
| Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
| HeaderMatcherSerializer |
100%
(1/1)
|
100%
(3/3)
|
100%
(18/18)
|
100%
(20/20)
|
100%
(182/182)
|
/*
* Copyright (c) 2026 skymansandy. All rights reserved.
*/
package dev.skymansandy.wiretap.helper.util
import dev.skymansandy.wiretap.domain.model.matchers.HeaderMatcher
/**
* Serializes/deserializes a list of HeaderMatcher to/from a single string for DB storage.
* Format: one entry per line, fields tab-separated.
* Entry format: TYPE\tkey\tvalue
* Types: K (KeyExists), VE (ValueExact), VC (ValueContains), VR (ValueRegex)
*/
object HeaderMatcherSerializer {
private const val ENTRY_SEP = "\n"
private const val FIELD_SEP = "\t"
fun serialize(matchers: List<HeaderMatcher>): String {
return matchers.joinToString(ENTRY_SEP) { m ->
when (m) {
is HeaderMatcher.KeyExists -> "K${FIELD_SEP}${m.key}${FIELD_SEP}"
is HeaderMatcher.ValueExact -> "VE${FIELD_SEP}${m.key}${FIELD_SEP}${m.value}"
is HeaderMatcher.ValueContains -> "VC${FIELD_SEP}${m.key}${FIELD_SEP}${m.value}"
is HeaderMatcher.ValueRegex -> "VR${FIELD_SEP}${m.key}${FIELD_SEP}${m.pattern}"
}
}
}
fun deserialize(data: String): List<HeaderMatcher> {
if (data.isBlank()) return emptyList()
return data.split(ENTRY_SEP).mapNotNull { entry ->
val parts = entry.split(FIELD_SEP)
if (parts.size < 2) return@mapNotNull null
val type = parts[0]
val key = parts[1]
val value = parts.getOrElse(2) { "" }
when (type) {
"K" -> HeaderMatcher.KeyExists(key)
"VE" -> HeaderMatcher.ValueExact(key, value)
"VC" -> HeaderMatcher.ValueContains(key, value)
"VR" -> HeaderMatcher.ValueRegex(key, value)
else -> null
}
}
}
}