b315eb18创建于 2025年11月10日历史提交
/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2024-2025. All rights reserved.
 */
package cjjson

import std.collection.*
import stdx.encoding.json.*

extend Int64 <: IJsonAdapter<Int64> {
    public static func fromJsonValue(jsonValue: JsonValue): Int64 {
        match (jsonValue) {
            case v: JsonInt => return v.getValue()
            case _ => throw JsonTypeMismatch("Int64", jsonValue.kind().toString())
        }
    }

    public func toJsonValue(): JsonValue {
        return JsonInt(this)
    }
}

extend Int32 <: IJsonAdapter<Int32> {
    public static func fromJsonValue(jsonValue: JsonValue): Int32 {
        match (jsonValue) {
            case v: JsonInt => return Int32(v.getValue())
            case _ => throw JsonTypeMismatch("Int32", jsonValue.kind().toString())
        }
    }

    public func toJsonValue(): JsonValue {
        return JsonInt(Int64(this))
    }
}

extend Int16 <: IJsonAdapter<Int16> {
    public static func fromJsonValue(jsonValue: JsonValue): Int16 {
        match (jsonValue) {
            case v: JsonInt => return Int16(v.getValue())
            case _ => throw JsonTypeMismatch("Int16", jsonValue.kind().toString())
        }
    }

    public func toJsonValue(): JsonValue {
        return JsonInt(Int64(this))
    }
}

extend Int8 <: IJsonAdapter<Int8> {
    public static func fromJsonValue(jsonValue: JsonValue): Int8 {
        match (jsonValue) {
            case v: JsonInt => return Int8(v.getValue())
            case _ => throw JsonTypeMismatch("Int8", jsonValue.kind().toString())
        }
    }

    public func toJsonValue(): JsonValue {
        return JsonInt(Int64(this))
    }
}

extend UInt64 <: IJsonAdapter<UInt64> {
    public static func fromJsonValue(jsonValue: JsonValue): UInt64 {
        match (jsonValue) {
            case v: JsonInt => return UInt64(v.getValue())
            case _ => throw JsonTypeMismatch("UInt64", jsonValue.kind().toString())
        }
    }

    public func toJsonValue(): JsonValue {
        return JsonInt(Int64(this))
    }
}

extend UInt32 <: IJsonAdapter<UInt32> {
    public static func fromJsonValue(jsonValue: JsonValue): UInt32 {
        match (jsonValue) {
            case v: JsonInt => return UInt32(v.getValue())
            case _ => throw JsonTypeMismatch("UInt32", jsonValue.kind().toString())
        }
    }

    public func toJsonValue(): JsonValue {
        return JsonInt(Int64(this))
    }
}

extend UInt16 <: IJsonAdapter<UInt16> {
    public static func fromJsonValue(jsonValue: JsonValue): UInt16 {
        match (jsonValue) {
            case v: JsonInt => return UInt16(v.getValue())
            case _ => throw JsonTypeMismatch("UInt16", jsonValue.kind().toString())
        }
    }

    public func toJsonValue(): JsonValue {
        return JsonInt(Int64(this))
    }
}

extend UInt8 <: IJsonAdapter<UInt8> {
    public static func fromJsonValue(jsonValue: JsonValue): UInt8 {
        match (jsonValue) {
            case v: JsonInt => return UInt8(v.getValue())
            case _ => throw JsonTypeMismatch("UInt8", jsonValue.kind().toString())
        }
    }

    public func toJsonValue(): JsonValue {
        return JsonInt(Int64(this))
    }
}

extend Float64 <: IJsonAdapter<Float64> {
    public static func fromJsonValue(jsonValue: JsonValue): Float64 {
        match (jsonValue) {
            case v: JsonFloat => return v.getValue()
            case _ => throw JsonTypeMismatch("Float64", jsonValue.kind().toString())
        }
    }

    public func toJsonValue(): JsonValue {
        return JsonFloat(this)
    }
}

extend Float32 <: IJsonAdapter<Float32> {
    public static func fromJsonValue(jsonValue: JsonValue): Float32 {
        match (jsonValue) {
            case v: JsonFloat => return Float32(v.getValue())
            case _ => throw JsonTypeMismatch("Float32", jsonValue.kind().toString())
        }
    }

    public func toJsonValue(): JsonValue {
        return JsonFloat(Float64(this))
    }
}

extend Float16 <: IJsonAdapter<Float16> {
    public static func fromJsonValue(jsonValue: JsonValue): Float16 {
        match (jsonValue) {
            case v: JsonFloat => return Float16(v.getValue())
            case _ => throw JsonTypeMismatch("Float16", jsonValue.kind().toString())
        }
    }

    public func toJsonValue(): JsonValue {
        return JsonFloat(Float64(this))
    }
}

extend String <: IJsonAdapter<String> {
    public static func fromJsonValue(jsonValue: JsonValue): String {
        match (jsonValue) {
            case v: JsonString => return v.getValue()
            case _ => throw JsonTypeMismatch("String", jsonValue.kind().toString())
        }
    }

    public func toJsonValue(): JsonValue {
        return JsonString(this)
    }
}

extend Bool <: IJsonAdapter<Bool> {
    public static func fromJsonValue(jsonValue: JsonValue): Bool {
        match (jsonValue) {
            case v: JsonBool => return v.getValue()
            case _ => throw JsonTypeMismatch("Bool", jsonValue.kind().toString())
        }
    }

    public func toJsonValue(): JsonValue {
        return JsonBool(this)
    }
}

extend<T> Option<T> <: IJsonAdapter<Option<T>> where T <: IJsonAdapter<T> {
    public static func fromJsonValue(jsonValue: JsonValue): Option<T> {
        if (jsonValue is JsonNull) {
            return None
        } else {
            return T.fromJsonValue(jsonValue)
        }
    }

    public func toJsonValue(): JsonValue {
        if (let Some(v) <- this) {
            v.toJsonValue()
        } else {
            JsonNull()
        }
    }
}

extend<T> Array<T> <: IJsonAdapter<Array<T>> where T <: IJsonAdapter<T> {
    public static func fromJsonValue(jsonValue: JsonValue): Array<T> {
        match (jsonValue) {
            case arr: JsonArray => return Array<T>(arr.size(), {index => T.fromJsonValue(arr[index])})
            case _ => throw JsonTypeMismatch("Array", jsonValue.kind().toString())
        }
    }

    public func toJsonValue(): JsonValue {
        let list = Array<JsonValue>(this.size, {index => this[index].toJsonValue()})
        return JsonArray(list)
    }
}

extend<T> ArrayList<T> <: IJsonAdapter<ArrayList<T>> where T <: IJsonAdapter<T> {
    public static func fromJsonValue(jsonValue: JsonValue): ArrayList<T> {
        match (jsonValue) {
            case arr: JsonArray => return ArrayList<T>(arr.size(), {index => T.fromJsonValue(arr[index])})
            case _ => throw JsonTypeMismatch("ArrayList", jsonValue.kind().toString())
        }
    }

    public func toJsonValue(): JsonValue {
        let list = Array<JsonValue>(this.size, {index => this[index].toJsonValue()})
        return JsonArray(list)
    }
}

extend<T> HashSet<T> <: IJsonAdapter<HashSet<T>> where T <: IJsonAdapter<T> & Hashable & Equatable<T> {
    public static func fromJsonValue(jsonValue: JsonValue): HashSet<T> {
        match (jsonValue) {
            case arr: JsonArray => return HashSet<T>(arr.size(), {index => T.fromJsonValue(arr[index])})
            case _ => throw JsonTypeMismatch("HashSet", jsonValue.kind().toString())
        }
    }

    public func toJsonValue(): JsonValue {
        let ret = JsonArray()
        for (item in this) {
            ret.add(item.toJsonValue())
        }
        return ret
    }
}

extend<V> HashMap<String, V> <: IJsonAdapter<HashMap<String, V>> where V <: IJsonAdapter<V> {
    public static func fromJsonValue(jsonValue: JsonValue): HashMap<String, V> {
        let map = HashMap<String, V>()
        match (jsonValue) {
            case obj: JsonObject => for ((key, value) in obj.getFields()) {
                map.add(key, V.fromJsonValue(value))
            }
            case _ => throw JsonTypeMismatch("HashMap", jsonValue.kind().toString())
        }
        return map
    }

    public func toJsonValue(): JsonValue {
        let obj = JsonObject()
        for ((key, item) in this) {
            obj.put(key, item.toJsonValue())
        }
        return obj
    }
}