package org.xbib.datastructures.json.iterator.spi;

import org.xbib.datastructures.json.iterator.JsonIterator;

import java.io.IOException;

public interface Decoder {
    /**
     * Customized decoder to read values from iterator
     *
     * @param iter the iterator instance
     * @return the value to set
     * @throws IOException when reading from iterator triggered error
     */
    Object decode(JsonIterator iter) throws IOException;

    abstract class BooleanDecoder implements Decoder {
        @Override
        public Object decode(JsonIterator iter) throws IOException {
            return Boolean.valueOf(decodeBoolean(iter));
        }

        public abstract boolean decodeBoolean(JsonIterator iter) throws IOException;
    }

    abstract class ShortDecoder implements Decoder {
        @Override
        public Object decode(JsonIterator iter) throws IOException {
            return Short.valueOf(decodeShort(iter));
        }

        public abstract short decodeShort(JsonIterator iter) throws IOException;
    }

    abstract class IntDecoder implements Decoder {
        @Override
        public Object decode(JsonIterator iter) throws IOException {
            return Integer.valueOf(decodeInt(iter));
        }

        public abstract int decodeInt(JsonIterator iter) throws IOException;
    }

    abstract class LongDecoder implements Decoder {
        @Override
        public Object decode(JsonIterator iter) throws IOException {
            return Long.valueOf(decodeLong(iter));
        }

        public abstract long decodeLong(JsonIterator iter) throws IOException;
    }

    abstract class FloatDecoder implements Decoder {
        @Override
        public Object decode(JsonIterator iter) throws IOException {
            return Float.valueOf(decodeFloat(iter));
        }

        public abstract float decodeFloat(JsonIterator iter) throws IOException;
    }

    abstract class DoubleDecoder implements Decoder {

        @Override
        public Object decode(JsonIterator iter) throws IOException {
            return Double.valueOf(decodeDouble(iter));
        }

        public abstract double decodeDouble(JsonIterator iter) throws IOException;
    }

}
