Circe-Instanzen zum Codieren / Decodieren versiegelter Merkmalsinstanzen von arity 0?

8

Ich verwende versiegelte Eigenschaften als Enums für eine vollständige Mustererkennung. In Fällen, in denen ich Fallobjekte anstelle von Fallklassen habe, die mein Merkmal erweitern, möchte ich (über Circe ) nur eine einfache Zeichenfolge codieren und dekodieren .

Zum Beispiel:

%Vor%

Ich verstehe, dass dies in 0.5.0 konfigurierbar sein wird, aber kann mir jemand helfen, etwas zu schreiben, um mich zu überbrücken, bis das veröffentlicht wird?

    
Andrew Roberts 03.05.2016, 18:38
quelle

1 Antwort

19

Um das Problem hervorzuheben - unter der Annahme dieses ADT:

%Vor% Die generische Ableitung von

circe erzeugt (derzeit) die folgenden Kodierungen:

%Vor%

Dies liegt daran, dass der generische Ableitungsmechanismus auf dem LabelledGeneric von Shapeless basiert, das Fallobjekte als leeres HList s darstellt. Dies wird wahrscheinlich immer das Standardverhalten sein, da es sauber, einfach und konsistent ist, aber es ist nicht immer das, was Sie wollen (wie Sie das Konfigurationsoptionen , die bald kommen, werden Alternativen unterstützen."

Sie können dieses Verhalten überschreiben, indem Sie eigene generische Instanzen für Fallobjekte bereitstellen:

%Vor%

Dies sagt, "wenn die generische Darstellung von A eine leere HList ist, kodiere sie als ihren Namen als JSON-String". Und es funktioniert so, wie wir es bei Case-Objekten erwarten, die statisch wie sie selbst typisiert sind:

%Vor%

Wenn der Wert statisch als Basistyp eingegeben wird, ist die Geschichte ein wenig anders:

%Vor%

Wir erhalten eine generisch abgeleitete Instanz für State und respektieren unsere manuell definierte generische Instanz für Case-Objekte, aber sie werden immer noch in ein Objekt eingebunden. Dies ist sinnvoll, wenn Sie darüber nachdenken - der ADT könnte Fallklassen enthalten, die nur vernünftig als JSON-Objekt dargestellt werden können, und so den Objekt-Wrapper-mit-Konstruktor-Namen-Schlüssel-Ansatz ist wohl die vernünftigste Sache zu tun.

Es ist jedoch nicht das einzige, was wir tun können, da wir statisch wissen, ob der ADT Fallklassen oder nur Fallobjekte enthält. Zuerst brauchen wir eine neue Typklasse, die bezeugt, dass ein ADT nur aus Fallobjekten besteht (beachte, dass ich hier von einem Neuanfang ausgehe, aber es sollte möglich sein, dies zusammen mit der generischen Ableitung durchzuführen):

%Vor%

Und dann unsere generischen Encoder Instanzen:

%Vor%

Könnte auch gehen und den Decoder auch schreiben.

%Vor%

Und dann:

%Vor%

Was wir wollten.

    
Travis Brown 03.05.2016, 22:05
quelle

Tags und Links