From c15cb74b7335829b8a77b86f5ce4193856507626 Mon Sep 17 00:00:00 2001
From: usbharu <i@usbharu.dev>
Date: Tue, 24 Sep 2024 11:27:23 +0900
Subject: [PATCH] =?UTF-8?q?feat:=20StructuredField=E3=82=92=E6=89=B1?=
 =?UTF-8?q?=E3=81=88=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../httpsignature/v2/SignatureBaseBuilder.kt  | 20 +++++++++++++++++--
 .../v2/StructuredFieldComponent.kt            | 12 +++++++++++
 2 files changed, 30 insertions(+), 2 deletions(-)
 create mode 100644 src/main/kotlin/dev/usbharu/httpsignature/v2/StructuredFieldComponent.kt

diff --git a/src/main/kotlin/dev/usbharu/httpsignature/v2/SignatureBaseBuilder.kt b/src/main/kotlin/dev/usbharu/httpsignature/v2/SignatureBaseBuilder.kt
index db1c9a5..6c2c385 100644
--- a/src/main/kotlin/dev/usbharu/httpsignature/v2/SignatureBaseBuilder.kt
+++ b/src/main/kotlin/dev/usbharu/httpsignature/v2/SignatureBaseBuilder.kt
@@ -1,5 +1,6 @@
 package dev.usbharu.httpsignature.v2
 
+import org.greenbytes.http.sfv.Parser
 import java.net.http.HttpRequest
 import kotlin.jvm.optionals.getOrNull
 
@@ -56,15 +57,30 @@ class SignatureBaseBuilder {
         return this
     }
 
-    fun header(headerName:String,headerValues:List<String>): SignatureBaseBuilder {
+    fun header(headerName: String, headerValues: List<String>): SignatureBaseBuilder {
         signatureBase.addComponent(HttpMessageComponent(headerName, headerValues))
         return this
     }
 
-    fun header(headerName: String,headerValue:String): SignatureBaseBuilder {
+    fun header(headerName: String, headerValue: String): SignatureBaseBuilder {
         return header(headerName, listOf(headerValue))
     }
 
+    fun structuredFieldItem(fieldName: String, fieldValue: String): SignatureBaseBuilder {
+        signatureBase.addComponent(StructuredFieldComponent(fieldName, Parser(fieldValue).parseItem()))
+        return this
+    }
+
+    fun structuredFieldList(fieldName: String, fieldValue: String): SignatureBaseBuilder {
+        signatureBase.addComponent(StructuredFieldComponent(fieldName, Parser(fieldValue).parseList()))
+        return this
+    }
+
+    fun structuredFieldDictionary(fieldName: String, fieldValue: String): SignatureBaseBuilder {
+        signatureBase.addComponent(StructuredFieldComponent(fieldName, Parser(fieldValue).parseDictionary()))
+        return this
+    }
+
     companion object {
         fun fromHttpRequest(httpRequest: HttpRequest): SignatureBaseBuilder {
             val signatureBaseBuilder = SignatureBaseBuilder()
diff --git a/src/main/kotlin/dev/usbharu/httpsignature/v2/StructuredFieldComponent.kt b/src/main/kotlin/dev/usbharu/httpsignature/v2/StructuredFieldComponent.kt
new file mode 100644
index 0000000..9efc9a7
--- /dev/null
+++ b/src/main/kotlin/dev/usbharu/httpsignature/v2/StructuredFieldComponent.kt
@@ -0,0 +1,12 @@
+package dev.usbharu.httpsignature.v2
+
+import org.greenbytes.http.sfv.Type
+
+class StructuredFieldComponent(val name: String, val structuredField: Type<*>) : Component {
+    override val componentName: String
+        get() = name
+    override val componentParameter: String
+        get() = "sf"
+    override val componentValue: String
+        get() = structuredField.serialize()
+}
\ No newline at end of file