#ifndef LEXER_DATA_H
#define LEXER_DATA_H

typedef enum {
  // GENERAL STATES
  LEXER_STATE_ERROR,
  LEXER_STATE_START,
  LEXER_STATE_VALUE,
  LEXER_STATE_VALUE_END,
  // COLLECTION STATES
  LEXER_STATE_OBJECT_START,
  LEXER_STATE_OBJECT,
  LEXER_STATE_OBJECT_END,
  LEXER_STATE_ARRAY_START,
  LEXER_STATE_ARRAY,
  LEXER_STATE_ARRAY_END,
  LEXER_STATE_LAST_COLLECTION,
  // OBJECT STATES
  LEXER_STATE_KEY,
  LEXER_STATE_KEY_END,
  // NUMBER STATES
  LEXER_STATE_DECIMAL,
  LEXER_STATE_NUMBER,
  LEXER_STATE_FRACTION,
  LEXER_STATE_EXPONENT,
  LEXER_STATE_EXP_SIGN,
  LEXER_STATE_POWER,
  LEXER_STATE_NUMBER_END,
  // STRING STATES
  LEXER_STATE_STRING,
  LEXER_STATE_STRING_END,
  LEXER_STATE_ESCAPE_SEQUENCE,
  LEXER_STATE_UNICODE_HEX1,
  LEXER_STATE_UNICODE_HEX2,
  LEXER_STATE_UNICODE_HEX3,
  LEXER_STATE_UNICODE_HEX4,
  // KEYWORD STATES
  LEXER_STATE_T,
  LEXER_STATE_TR,
  LEXER_STATE_TRU,
  LEXER_STATE_TRUE,
  LEXER_STATE_F,
  LEXER_STATE_FA,
  LEXER_STATE_FAL,
  LEXER_STATE_FALS,
  LEXER_STATE_FALSE,
  LEXER_STATE_N,
  LEXER_STATE_NU,
  LEXER_STATE_NUL,
  LEXER_STATE_NULL,
  LEXER_STATE_KEYWORD_END,

  COUNT_LEXER_STATES,
} lexer_state_t;

typedef enum {
  LEXER_INPUT_WHITE_SPACE,
  LEXER_INPUT_OPEN_BRACE,
  LEXER_INPUT_CLOSE_BRACE,
  LEXER_INPUT_OPEN_BRACKET,
  LEXER_INPUT_CLOSE_BRACKET,
  LEXER_INPUT_COMMA,
  LEXER_INPUT_COLON,
  LEXER_INPUT_DOUBLE_QUOTE,
  LEXER_INPUT_BACK_SLASH,
  LEXER_INPUT_FORWARD_SLASH,
  LEXER_INPUT_LOWER_A,
  LEXER_INPUT_LOWER_B,
  LEXER_INPUT_LOWER_C,
  LEXER_INPUT_LOWER_D,
  LEXER_INPUT_LOWER_E,
  LEXER_INPUT_LOWER_F,
  LEXER_INPUT_LOWER_L,
  LEXER_INPUT_LOWER_N,
  LEXER_INPUT_LOWER_R,
  LEXER_INPUT_LOWER_S,
  LEXER_INPUT_LOWER_T,
  LEXER_INPUT_LOWER_U,
  LEXER_INPUT_UPPER_A,
  LEXER_INPUT_UPPER_B,
  LEXER_INPUT_UPPER_C,
  LEXER_INPUT_UPPER_D,
  LEXER_INPUT_UPPER_E,
  LEXER_INPUT_UPPER_F,
  LEXER_INPUT_MINUS,
  LEXER_INPUT_PLUS,
  LEXER_INPUT_DECIMAL,
  LEXER_INPUT_ZERO,
  LEXER_INPUT_NON_ZERO,
  LEXER_INPUT_OTHER,

  COUNT_LEXER_INPUTS,
} lexer_input_t;

#endif // !LEXER_DATA_H