proxygen
folly::json_pointer Class Reference

#include <json_pointer.h>

Classes

class  parse_exception
 

Public Types

enum  parse_error { parse_error::invalid_first_character, parse_error::invalid_escape_sequence }
 

Public Member Functions

 json_pointer ()=default
 
 ~json_pointer ()=default
 
bool is_prefix_of (json_pointer const &other) const noexcept
 
std::vector< std::string > const & tokens () const
 

Static Public Member Functions

static Expected< json_pointer, parse_errortry_parse (StringPiece const str)
 
static json_pointer parse (StringPiece const str)
 

Private Member Functions

 json_pointer (std::vector< std::string >) noexcept
 

Static Private Member Functions

static bool unescape (std::string &)
 

Private Attributes

std::vector< std::stringtokens_
 

Friends

bool operator== (json_pointer const &lhs, json_pointer const &rhs)
 
bool operator!= (json_pointer const &lhs, json_pointer const &rhs)
 

Detailed Description

Definition at line 35 of file json_pointer.h.

Member Enumeration Documentation

Enumerator
invalid_first_character 
invalid_escape_sequence 

Definition at line 37 of file json_pointer.h.

37  {
38  invalid_first_character,
39  invalid_escape_sequence,
40  };

Constructor & Destructor Documentation

folly::json_pointer::json_pointer ( )
default

Referenced by try_parse().

folly::json_pointer::~json_pointer ( )
default
folly::json_pointer::json_pointer ( std::vector< std::string tokens)
explicitprivatenoexcept

Definition at line 81 of file json_pointer.cpp.

References folly::gen::move, and tokens().

82  : tokens_{std::move(tokens)} {}
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
std::vector< std::string > tokens_
Definition: json_pointer.h:84

Member Function Documentation

bool folly::json_pointer::is_prefix_of ( json_pointer const &  other) const
noexcept

Definition at line 66 of file json_pointer.cpp.

References tokens_.

66  {
67  auto const& other_tokens = other.tokens();
68  if (tokens_.size() > other_tokens.size()) {
69  return false;
70  }
71  auto const other_begin = other_tokens.cbegin();
72  auto const other_end = other_tokens.cbegin() + tokens_.size();
73  return std::equal(tokens_.cbegin(), tokens_.cend(), other_begin, other_end);
74 }
std::vector< std::string > tokens_
Definition: json_pointer.h:84
json_pointer folly::json_pointer::parse ( StringPiece const  str)
static

Definition at line 49 of file json_pointer.cpp.

References folly::assume_unreachable(), invalid_escape_sequence, invalid_first_character, folly::gen::move, and try_parse().

49  {
50  auto res = try_parse(str);
51  if (res.hasValue()) {
52  return std::move(res.value());
53  }
54  switch (res.error()) {
56  throw json_pointer::parse_exception(
57  "non-empty JSON pointer string does not start with '/'");
59  throw json_pointer::parse_exception(
60  "Invalid escape sequence in JSON pointer string");
61  default:
63  }
64 }
static Expected< json_pointer, parse_error > try_parse(StringPiece const str)
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
FOLLY_ALWAYS_INLINE void assume_unreachable()
Definition: Assume.h:59
std::vector< std::string > const & folly::json_pointer::tokens ( ) const

Definition at line 76 of file json_pointer.cpp.

References tokens_.

Referenced by json_pointer(), and try_parse().

76  {
77  return tokens_;
78 }
std::vector< std::string > tokens_
Definition: json_pointer.h:84
Expected< json_pointer, json_pointer::parse_error > folly::json_pointer::try_parse ( StringPiece const  str)
static

Definition at line 24 of file json_pointer.cpp.

References folly::Range< Iter >::at(), folly::Range< Iter >::empty(), invalid_escape_sequence, invalid_first_character, json_pointer(), folly::makeUnexpected(), folly::gen::move, tokens(), and unescape().

Referenced by parse(), and folly::json_patch::try_parse().

25  {
26  // pointer describes complete document
27  if (str.empty()) {
28  return json_pointer{};
29  }
30 
31  if (str.at(0) != '/') {
33  }
34 
35  std::vector<std::string> tokens;
36  splitTo<std::string>("/", str, std::inserter(tokens, tokens.begin()));
37  tokens.erase(tokens.begin());
38 
39  for (auto& token : tokens) {
40  if (!unescape(token)) {
42  }
43  }
44 
45  return json_pointer(std::move(tokens));
46 }
static bool unescape(std::string &)
std::vector< std::string > const & tokens() const
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
json_pointer()=default
constexpr Unexpected< typename std::decay< Error >::type > makeUnexpected(Error &&)
Definition: Expected.h:785
bool folly::json_pointer::unescape ( std::string str)
staticprivate

Definition at line 85 of file json_pointer.cpp.

References fizz::decode(), and folly::test::end().

Referenced by try_parse().

85  {
86  char const* end = &str[str.size()];
87  char* out = &str.front();
88  char const* decode = out;
89  while (decode < end) {
90  if (*decode != '~') {
91  *out++ = *decode++;
92  continue;
93  }
94  if (decode + 1 == end) {
95  return false;
96  }
97  switch (decode[1]) {
98  case '1':
99  *out++ = '/';
100  break;
101  case '0':
102  *out++ = '~';
103  break;
104  default:
105  return false;
106  }
107  decode += 2;
108  }
109  str.resize(out - &str.front());
110  return true;
111 }
TokenBindingMessage decode(folly::io::Cursor &cursor)
Definition: Types.cpp:132
auto end(TestAdlIterable &instance)
Definition: ForeachTest.cpp:62

Friends And Related Function Documentation

bool operator!= ( json_pointer const &  lhs,
json_pointer const &  rhs 
)
friend

Definition at line 72 of file json_pointer.h.

72  {
73  return lhs.tokens_ != rhs.tokens_;
74  }
FOLLY_PUSH_WARNING RHS rhs
Definition: Traits.h:649
bool operator== ( json_pointer const &  lhs,
json_pointer const &  rhs 
)
friend

Definition at line 68 of file json_pointer.h.

68  {
69  return lhs.tokens_ == rhs.tokens_;
70  }
FOLLY_PUSH_WARNING RHS rhs
Definition: Traits.h:649

Member Data Documentation

std::vector<std::string> folly::json_pointer::tokens_
private

Definition at line 84 of file json_pointer.h.

Referenced by is_prefix_of(), and tokens().


The documentation for this class was generated from the following files: