Dev: add java enum encoding

This commit is contained in:
Andrew Druk 2017-11-06 15:35:52 +02:00
parent 03fa24482b
commit 1fb015ab58
1 changed files with 21 additions and 3 deletions

View File

@ -118,7 +118,14 @@ open class JavaEncoder: Encoder {
}
public func singleValueContainer() -> SingleValueEncodingContainer {
return JavaSingleValueEncodingContainer(encoder: self)
let storage = self.popInstance()
switch storage.type {
case let .object(className):
return JavaEnumValueEncodingContainer(encoder: self, javaClass: className, javaObject: storage.javaObject)
default:
fatalError("Only object type supported here")
}
}
}
@ -370,14 +377,20 @@ fileprivate class JavaArrayContainer : UnkeyedEncodingContainer {
}
}
class JavaSingleValueEncodingContainer: SingleValueEncodingContainer {
class JavaEnumValueEncodingContainer: SingleValueEncodingContainer {
var codingPath: [CodingKey]
let encoder: JavaEncoder
init(encoder: JavaEncoder) {
private var javaClass: String
private var javaObject: jobject
init(encoder: JavaEncoder, javaClass: String, javaObject: jobject) {
self.codingPath = [CodingKey]()
self.encoder = encoder
self.javaClass = javaClass
self.javaObject = javaObject
NSLog("Created \(javaClass) enum value encoding container")
}
public func encodeNil() throws {
@ -385,6 +398,11 @@ class JavaSingleValueEncodingContainer: SingleValueEncodingContainer {
}
public func encode<T : Encodable>(_ value: T) throws {
if value is Int {
let fieldID = try getJavaField(forClass: javaClass, field: "rawValue", sig: "J")
JNI.api.SetLongField(JNI.env, javaObject, fieldID, jlong(value as! Int))
return
}
throw JavaCodingError.notSupported("JavaSingleValueEncodingContainer.encode(value: \(value)")
}
}