@@ -32,6 +32,24 @@ sealed interface Response {
3232 @get:ApiStatus.AvailableSince (" 1.0.0" )
3333 val status: ResponseStatus
3434
35+ /* *
36+ * Response message (if present).
37+ *
38+ * @since 1.0.0
39+ * @author metabrix
40+ */
41+ @get:ApiStatus.AvailableSince (" 1.0.0" )
42+ val message: String?
43+
44+ /* *
45+ * API version used for this request (if present).
46+ *
47+ * @since 1.0.0
48+ * @author metabrix
49+ */
50+ @get:ApiStatus.AvailableSince (" 1.0.0" )
51+ val apiVersion: String?
52+
3553 /* *
3654 * Whether the response is successful ([ResponseStatus.isSuccessful]).
3755 *
@@ -67,8 +85,9 @@ sealed interface Response {
6785 * Successful response.
6886 *
6987 * @property status response status
70- * @property results map of IP addresses to their results
7188 * @property message optional message (present if [ResponseStatus.hasMessage] is `true`)
89+ * @property apiVersion API version used for this request (if present)
90+ * @property results map of IP addresses to their results
7291 * @property node optional node identifier (present if [RequestConfiguration.returnNode] was set to `true`)
7392 * @property queryTime time the server took to process the query in milliseconds, excluding network RTT
7493 * @since 1.0.0
@@ -77,8 +96,9 @@ sealed interface Response {
7796 @ApiStatus.AvailableSince (" 1.0.0" )
7897 data class Success (
7998 override val status : ResponseStatus ,
99+ override val message : String? ,
100+ override val apiVersion : String? ,
80101 val results : Map <InetAddress , AddressResult >,
81- val message : String? ,
82102 val node : String? ,
83103 val queryTime : Long? ,
84104 ) : Response {
@@ -89,14 +109,16 @@ sealed interface Response {
89109
90110 private constructor (
91111 status: ResponseStatus ,
92- results: Map <InetAddress , AddressResult >,
93112 message: Optional <String >,
113+ apiVersion: Optional <String >,
114+ results: Map <InetAddress , AddressResult >,
94115 node: Optional <String >,
95116 queryTime: Optional <Long >,
96117 ) : this (
97118 status = status,
98- results = results,
99119 message = message.getOrNull(),
120+ apiVersion = apiVersion.getOrNull(),
121+ results = results,
100122 node = node.getOrNull(),
101123 queryTime = queryTime.getOrNull(),
102124 )
@@ -109,11 +131,13 @@ sealed interface Response {
109131 Codec .STRING .optionalFieldOf(" message" ).forNullableGetter(Success ::message),
110132 Codec .STRING .optionalFieldOf(" node" ).forNullableGetter(Success ::node),
111133 Codec .LONG .optionalFieldOf(" query_time" ).forNullableGetter(Success ::queryTime),
112- ).apply (instance) { status, message, node, queryTime ->
134+ Codec .STRING .optionalFieldOf(" version" ).forNullableGetter(Success ::apiVersion),
135+ ).apply (instance) { status, message, node, queryTime, apiVersion ->
113136 Success (
114137 status = status,
115- results = emptyMap(),
116138 message = message,
139+ apiVersion = apiVersion,
140+ results = emptyMap(),
117141 node = node,
118142 queryTime = queryTime,
119143 )
@@ -141,10 +165,10 @@ sealed interface Response {
141165 input : T ,
142166 ): DataResult <Pair <Success , T >> {
143167 val metadataResult = METADATA_CODEC .decode(ops, input)
144- val nonMetadataKeys = METADATA_MAP_CODEC .keys(ops).toList()
168+ val metadataKeys = METADATA_MAP_CODEC .keys(ops).toList()
145169
146170 return ops.getMap(input)
147- .map { mapLike -> ops.createMap(mapLike.entries().filter { (key, _) -> key !in nonMetadataKeys }) }
171+ .map { mapLike -> ops.createMap(mapLike.entries().filter { (key, _) -> key !in metadataKeys }) }
148172 .flatMap { remainingEntries -> AddressResult .IP_STRING_TO_RESULT_CODEC .decode(ops, remainingEntries) }
149173 .map { (results, _) -> results }
150174 .flatMap { results -> metadataResult.map { (metadata, _) -> metadata.copy(results = results) } }
@@ -159,13 +183,15 @@ sealed interface Response {
159183 *
160184 * @property status response status
161185 * @property message optional message (present if [ResponseStatus.hasMessage] is `true`)
186+ * @property apiVersion API version used for this request (if present)
162187 * @since 1.0.0
163188 * @author metabrix
164189 */
165190 @ApiStatus.AvailableSince (" 1.0.0" )
166191 data class Failure (
167192 override val status : ResponseStatus ,
168- val message : String? = null ,
193+ override val message : String? = null ,
194+ override val apiVersion : String? = null ,
169195 ) : Response {
170196 init {
171197 require(! this .status.isSuccessful) { " Cannot create an unsuccessful response with a successful status: ${this .status} " }
@@ -175,9 +201,11 @@ sealed interface Response {
175201 private constructor (
176202 status: ResponseStatus ,
177203 message: Optional <String >,
204+ apiVersion: Optional <String >,
178205 ) : this (
179206 status = status,
180207 message = message.getOrNull(),
208+ apiVersion = apiVersion.getOrNull(),
181209 )
182210
183211 companion object {
@@ -186,6 +214,7 @@ sealed interface Response {
186214 instance.group(
187215 ResponseStatus .NON_SUCCESSFUL_CODEC .fieldOf(" status" ).forGetter(Failure ::status),
188216 Codec .STRING .optionalFieldOf(" message" ).forNullableGetter(Failure ::message),
217+ Codec .STRING .optionalFieldOf(" version" ).forNullableGetter(Failure ::apiVersion),
189218 ).apply (instance, ::Failure )
190219 }
191220 }
0 commit comments