View test reports →

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
             }
         }
     }
 }