Autonomy Software C++ 24.5.1
Welcome to the Autonomy Software repository of the Mars Rover Design Team (MRDT) at Missouri University of Science and Technology (Missouri S&T)! API reference contains the source code and other resources for the development of the autonomy software for our Mars rover. The Autonomy Software project aims to compete in the University Rover Challenge (URC) by demonstrating advanced autonomous capabilities and robust navigation algorithms.
Loading...
Searching...
No Matches
duckdb::JSONParser Struct Reference
Inheritance diagram for duckdb::JSONParser:
Collaboration diagram for duckdb::JSONParser:

Classes

struct  Separator
 

Public Member Functions

bool Process (const string &value)
 

Protected Types

enum class  JSONState { REGULAR , IN_QUOTE , ESCAPE }
 

Protected Member Functions

virtual void HandleNull ()
 
virtual void HandleBracketOpen (char bracket)
 
virtual void HandleBracketClose (char bracket)
 
virtual void HandleQuoteStart (char quote)
 
virtual void HandleQuoteEnd (char quote)
 
virtual void HandleComma (char comma)
 
virtual void HandleColon ()
 
virtual void HandleCharacter (char c)
 
virtual void HandleEscapeStart (char c)
 
virtual void Finish ()
 
bool SeparatorIsMatching (Separator &sep, char closing_sep)
 
idx_t Depth () const
 

Protected Attributes

JSONState state = JSONState::REGULAR
 
vector< Separatorseparators
 
idx_t pos = 0
 
bool success = true
 

Member Enumeration Documentation

◆ JSONState

enum class duckdb::JSONParser::JSONState
strongprotected
48284{ REGULAR, IN_QUOTE, ESCAPE };

Member Function Documentation

◆ Process()

bool duckdb::JSONParser::Process ( const string &  value)
48348 {
48349 separators.clear();
48350 state = JSONState::REGULAR;
48351 char quote_char = '"';
48352 bool can_parse_value = false;
48353 bool in_unquoted_value = false;
48354 pos = 0;
48355 for (; success && pos < value.size(); pos++) {
48356 auto c = value[pos];
48357 if (state == JSONState::REGULAR) {
48358 if (can_parse_value) {
48359 // check if this is "null"
48360 if (pos + 4 < value.size() && StringUtil::CharacterToLower(c) == 'n' &&
48361 StringUtil::CharacterToLower(value[pos + 1]) == 'u' &&
48362 StringUtil::CharacterToLower(value[pos + 2]) == 'l' &&
48363 StringUtil::CharacterToLower(value[pos + 3]) == 'l') {
48364 HandleNull();
48365 pos += 3;
48366 continue;
48367 }
48368 }
48369 switch (c) {
48370 case '[':
48371 case '{': {
48372 // add a newline and indentation based on the separator count
48373 separators.push_back(c);
48374 HandleBracketOpen(c);
48375 can_parse_value = c == '[';
48376 break;
48377 }
48378 case '}':
48379 case ']': {
48380 // closing bracket - move to next line and pop back the separator
48381 if (separators.empty() || !SeparatorIsMatching(separators.back(), c)) {
48382 throw InternalException("Failed to parse JSON string %s - invalid JSON", value);
48383 }
48384 separators.pop_back();
48385 HandleBracketClose(c);
48386 in_unquoted_value = false;
48387 break;
48388 }
48389 case '"':
48390 case '\'':
48391 HandleQuoteStart(c);
48392 quote_char = c;
48393 state = JSONState::IN_QUOTE;
48394 break;
48395 case ',':
48396 // comma - move to next line
48397 HandleComma(c);
48398 in_unquoted_value = false;
48399 break;
48400 case ':':
48401 HandleColon();
48402 can_parse_value = true;
48403 break;
48404 case '\\':
48405 // skip literal "\n" and "\t" (these were escaped previously by our rendering algorithm)
48406 if (pos + 1 < value.size() && IsWhitespaceEscape(value[pos + 1])) {
48407 pos++;
48408 break;
48409 }
48410 // if this is not a whitespace escape just handle it
48411 HandleCharacter(c);
48412 break;
48413 case ' ':
48414 if (in_unquoted_value) {
48415 HandleCharacter(c);
48416 }
48417 break;
48418 case '\t':
48419 case '\n':
48420 // skip whitespace
48421 break;
48422 default:
48423 in_unquoted_value = true;
48424 HandleCharacter(c);
48425 break;
48426 }
48427 } else if (state == JSONState::IN_QUOTE) {
48428 if (c == quote_char) {
48429 // break out of quotes
48430 state = JSONState::REGULAR;
48431 HandleQuoteEnd(c);
48432 } else if (c == '\\') {
48433 // escape
48434 state = JSONState::ESCAPE;
48435 HandleEscapeStart(c);
48436 } else {
48437 HandleCharacter(c);
48438 }
48439 } else if (state == JSONState::ESCAPE) {
48440 state = JSONState::IN_QUOTE;
48441 HandleCharacter(c);
48442 } else {
48443 throw InternalException("Invalid json state");
48444 }
48445 }
48446 if (!success) {
48447 return false;
48448 }
48449 Finish();
48450 return true;
48451}

◆ HandleNull()

virtual void duckdb::JSONParser::HandleNull ( )
inlineprotectedvirtual
48299 {
48300 }

◆ HandleBracketOpen()

virtual void duckdb::JSONParser::HandleBracketOpen ( char  bracket)
inlineprotectedvirtual
48301 {
48302 }

◆ HandleBracketClose()

virtual void duckdb::JSONParser::HandleBracketClose ( char  bracket)
inlineprotectedvirtual
48303 {
48304 }

◆ HandleQuoteStart()

virtual void duckdb::JSONParser::HandleQuoteStart ( char  quote)
inlineprotectedvirtual
48305 {
48306 }

◆ HandleQuoteEnd()

virtual void duckdb::JSONParser::HandleQuoteEnd ( char  quote)
inlineprotectedvirtual
48307 {
48308 }

◆ HandleComma()

virtual void duckdb::JSONParser::HandleComma ( char  comma)
inlineprotectedvirtual
48309 {
48310 }

◆ HandleColon()

virtual void duckdb::JSONParser::HandleColon ( )
inlineprotectedvirtual
48311 {
48312 }

◆ HandleCharacter()

virtual void duckdb::JSONParser::HandleCharacter ( char  c)
inlineprotectedvirtual
48313 {
48314 }

◆ HandleEscapeStart()

virtual void duckdb::JSONParser::HandleEscapeStart ( char  c)
inlineprotectedvirtual
48315 {
48316 }

◆ Finish()

virtual void duckdb::JSONParser::Finish ( )
inlineprotectedvirtual
48317 {
48318 }

◆ SeparatorIsMatching()

bool duckdb::JSONParser::SeparatorIsMatching ( Separator sep,
char  closing_sep 
)
protected
48333 {
48334 if (sep.sep == '{' && closing_sep == '}') {
48335 return true;
48336 }
48337 if (sep.sep == '[' && closing_sep == ']') {
48338 return true;
48339 }
48340 return false;
48341}

◆ Depth()

idx_t duckdb::JSONParser::Depth ( ) const
inlineprotected
48322 {
48323 return separators.size();
48324 }

The documentation for this struct was generated from the following file: