/* * Copyright 2017 Christian Basler * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package ch.dissem.msgpack import ch.dissem.msgpack.types.* import java.io.IOException import java.io.InputStream /** * Reads MPType object from an [InputStream]. */ object Reader { private val unpackers = mutableListOf>() init { unpackers.add(MPNil.Unpacker()) unpackers.add(MPBoolean.Unpacker()) unpackers.add(MPInteger.Unpacker()) unpackers.add(MPFloat.Unpacker()) unpackers.add(MPString.Unpacker()) unpackers.add(MPBinary.Unpacker()) unpackers.add(MPMap.Unpacker(this)) unpackers.add(MPArray.Unpacker(this)) } /** * Register your own extensions. The last registered unpacker always takes precedence. */ fun register(unpacker: MPType.Unpacker<*>) { unpackers.add(0, unpacker) } @Throws(IOException::class) fun read(input: InputStream): MPType<*> { val firstByte = input.read() unpackers .firstOrNull { it.doesUnpack(firstByte) } ?.let { return it.unpack(firstByte, input) } throw IOException(String.format("Unsupported input, no reader for 0x%02x", firstByte)) } }