Как сериализоваться во внешне помеченное перечисление(полиморфные классы) на kotlin klaxon?

#json #kotlin #enums #serde #klaxon

Вопрос:

Я пытаюсь сериализовать, чтобы соответствовать тому, как в Rust Serde вы делаете перечисление «с внешней меткой» с помощью клаксона.

Это мое определение по Котлину:

 @TypeFor(field = "type", adapter = QueryTypeAdapter::class)
open class Query(val type: QueryType)
data class StartTravel(val from:Coordinates, val to:Coordinates): Query(QueryType.StartTravel)
class SearchingDriver: Query(QueryType.SearchDriver)
data class Fail(val error:JsonError): Query(QueryType.Fail)

class QueryTypeAdapter: TypeAdapter<Query> {
    override fun classFor(type: Any): KClass<out Query> = when(type as QueryType) {
        QueryType.StartTravel-> StartTravel::class
        QueryType.SearchDriver -> SearchingDriver::class
        QueryType.Fail -> Fail::class
    }
}
 

Мне это нужно для десериализации, как:

 {"StartTravel":{"from":{"lat":0.0,"long":0.0},"to":{"lat":0.0,"long":0.0}}}
 

Но сейчас:

 {"from" : {"lat" : 0.0, "long" : 0.0}, "to" : {"lat" : 0.0, "long" : 0.0}, "type" : "StartTravel"}
 

P. D: Определение ржавчины (с возможностью выполнения теста):

 #[derive(Debug, Deserialize, Serialize)]
pub struct JsonError {
    pub kind: String,
    pub message: String,
}

#[derive(Debug, Deserialize, Serialize)]
pub struct Coordinates {
    lat: f64,
    long: f64,
}

#[derive(Debug, Deserialize, Serialize)]
pub struct StartTravel {
    from: Coordinates,
    to: Coordinates,
}

#[derive(Debug, Deserialize, Serialize)]
pub enum QueryType {
    StartTravel(StartTravel),
    SearchingDriver,
    Fail(JsonError),
}