Extracts element with a given index from an array in a JSON stream
nth
@/nth
Extracts element with a given index from an array in a JSON stream
OUT2pulse
Pulses when a new parsed chunk is produced
OUT1@/parsed-json-chunk
Parsed chunk of an extracted value
#pragma XOD evaluate_on_pin disable
#pragma XOD evaluate_on_pin enable input_IN2
nodespace {
    using ParserState = xod::json_parser::ParserState;
}
node {
    uint16_t depth = 0;
    uint16_t currentIndex = 0;
    void evaluate(Context ctx) {
        if (!isInputDirty<input_IN2>(ctx)) return;
        auto desiredIndex = getValue<input_N>(ctx);
        auto parsed = getValue<input_IN1>(ctx);
        if (parsed.state == ParserState::START_ARRAY && depth == 0)
            currentIndex = 0;
        if (parsed.state == ParserState::START_OBJECT || parsed.state == ParserState::START_ARRAY)
            depth++;
        bool shouldDecreaseDepth = parsed.state == ParserState::AFTER_OBJECT || parsed.state == ParserState::AFTER_ARRAY || parsed.state == ParserState::DONE;
        // trailing ']' and '}' that are passed to indicate end of the value should not decrease depth
        if (shouldDecreaseDepth && depth > 0)
            depth--;
        // do not pass opening '['
        if (parsed.state == ParserState::START_ARRAY && depth == 1)
            return;
        if (desiredIndex == currentIndex) {
            emitValue<output_OUT1>(ctx, parsed);
            emitValue<output_OUT2>(ctx, true);
        }
        bool valueHasEnded = depth == 1 && parsed.state == ParserState::IN_ARRAY;
        bool arrayHasEnded = depth == 0 && parsed.state == ParserState::AFTER_ARRAY;
        if (valueHasEnded || arrayHasEnded) {
            currentIndex++;
            return;
        }
    }
}