All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.dslplatform.json.parsers.JsValueParser Maven / Gradle / Ivy

package com.dslplatform.json.parsers;

import com.dslplatform.json.JsonReader;
import com.dslplatform.json.ParsingException;
import jsonvalues.JsBool;
import jsonvalues.JsStr;
import jsonvalues.JsValue;
import jsonvalues.spec.Error;

import java.io.IOException;
import java.util.Optional;
import java.util.function.Function;

final class JsValueParser extends AbstractParser {
    private JsObjParser objDeserializer;
    private JsArrayOfValueParser arrayDeserializer;
    private JsNumberParser numberDeserializer;

    void setNumberDeserializer(final JsNumberParser numberDeserializer) {
        this.numberDeserializer = numberDeserializer;
    }

    void setObjDeserializer(final JsObjParser objDeserializer) {
        this.objDeserializer = objDeserializer;
    }

    void setArrayDeserializer(final JsArrayOfValueParser arrayDeserializer) {
        this.arrayDeserializer = arrayDeserializer;
    }

    JsValue valueSuchThat(final JsonReader reader,
                          final Function> fn

                         ) throws JsParserException {
        try {
            final JsValue         value  = value(reader);
            final Optional result = fn.apply(value);
            if (!result.isPresent()) return value;
            throw reader.newParseError(result.toString());
        } catch (ParsingException e) {
            throw new JsParserException(e.getMessage());

        }

    }

    @Override
    JsValue value(final JsonReader reader) throws JsParserException {
        try {
            switch (reader.last()) {
                case 't':
                    if (!reader.wasTrue()) {
                        throw new JsParserException(reader.newParseErrorAt("Expecting 'true' for true constant",
                                                                           0
                                                                          ));
                    }
                    return JsBool.TRUE;
                case 'f':
                    if (!reader.wasFalse()) {
                        throw new JsParserException(reader.newParseErrorAt("Expecting 'false' for false constant",
                                                                           0
                                                                          ));
                    }
                    return JsBool.FALSE;
                case '"':
                    return JsStr.of(reader.readString());
                case '{':
                    return objDeserializer.value(reader);
                case '[':
                    return arrayDeserializer.array(reader);
                default:
                    return numberDeserializer.value(reader);
            }
        } catch (IOException e) {
            throw new JsParserException(e.getMessage());
        }
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy