pub struct Content<B: Deref<Target = [u8]> + Debug>(/* private fields */);Expand description
Text content of a JSON token identified by a FixedAnalyzer.
See the lexical::Content trait, implemented by this struct, for detailed conceptual
documentation.
Implementations§
Source§impl Content<Vec<u8>>
impl Content<Vec<u8>>
Sourcepub fn from_static(s: &'static str) -> Self
pub fn from_static(s: &'static str) -> Self
Constructs a new Content value from a static lifetime string that contains a valid JSON
token.
The entire string must be a single valid lexical token. It may be the empty string, which is
equivalent to Token::Eof; or may be all whitespace, equivalent to Token::White. String
token content must begin and end with a double quote character.
§Panics
Panics if the string is not valid JSON token content.
§Example
let obj_begin = Content::from_static("{");
assert_eq!("{", obj_begin.literal());
assert!(!obj_begin.is_escaped());
let str_escaped = Content::from_static(r#""hello\nworld""#);
assert_eq!(r#""hello\nworld""#, str_escaped.literal());
assert!(str_escaped.is_escaped());
assert_eq!(r#""hello
world""#, str_escaped.unescaped());Source§impl<B: Deref<Target = [u8]> + Debug> Content<B>
impl<B: Deref<Target = [u8]> + Debug> Content<B>
Sourcepub fn literal(&self) -> &str
pub fn literal(&self) -> &str
Returns the literal content of the token exactly as it appears in the JSON text.
This is an inherent implementation of lexical::Content::literal for convenience, so it
is available even when you don’t have the trait imported. Refer to the trait documentation
for conceptual details.
Sourcepub fn literal_len(&self) -> usize
pub fn literal_len(&self) -> usize
Returns the number of bytes in the literal value.
Sourcepub fn is_escaped(&self) -> bool
pub fn is_escaped(&self) -> bool
Indicates whether the token content contains escape sequences.
This is an inherent implementation of lexical::Content::is_escaped for convenience, so
it is available even when you don’t have the trait imported. Refer to the trait
documentation for conceptual details.
Sourcepub fn unescaped(&self) -> Unescaped<&str>
pub fn unescaped(&self) -> Unescaped<&str>
Returns a normalized version of literal` with all escape sequences in the JSON text
fully expanded.
This is an inherent implementation of lexical::Content::unescaped for convenience, so
it is available even when you don’t have the trait imported. Refer to the trait
documentation for conceptual details.
§Performance considerations
- If this content belongs to a non-string token, or a string token that contains no escape
sequences, does not allocate, and simply returns an
Unescaped::Literalwrapping the borrow returned byliteral, which is a reference to the internals of this content. - If this content belongs to a string token containing at least one escape sequence,
allocates a new owned string value containing the unescaped string content and returns it
wrapped in
Unescaped::Expanded.
Sourcepub fn unescaped_cmp(&self, other: &str) -> Ordering
pub fn unescaped_cmp(&self, other: &str) -> Ordering
Compares the token content to another string, expanding embedded escape sequences.
For non-string tokens, and string tokens for which is_escaped returns false, this
method returns the equivalent of self.literal().cmp(other).
For string tokens with one or more escape sequences, this method compares a normalized
version of the string value with escape sequences expanded to other. It gives the same
result as self.unescaped().cmp(other), but is faster because it avoids the accompanying
allocations and copying.
Note two important details. First, no unescaping is done on other, which is assumed to
contain a string with escape sequences fully expanded. Second, apart from expanding escape
sequences, self is compared byte-for-byte against other, so if self contains the
content of a string token, then other will need to begin and end with a quotation mark
character, " (U+0022) in order to compare equal.
§Performance considerations
Does not allocate.
Since this method is marginally less efficient than comparing directly against the literal
value, it is preferable to use it only when is_escaped returns true.
§Example
use bufjson::lexical::{Token, fixed::FixedAnalyzer};
use std::cmp::Ordering;
let mut an = FixedAnalyzer::new(&br#""hello\nworld! \ud83c\udf0d""#[..]);
assert_eq!(Token::Str, an.next());
assert_eq!(
Ordering::Equal, an.content().unescaped_cmp(r#""hello
world! 🌍""#));Sourcepub fn parse_i64(&self) -> Result<i64, NumError>
Available on crate feature num only.
pub fn parse_i64(&self) -> Result<i64, NumError>
num only.Converts the token content to a 64-bit signed integer.
This is an inherent implementation of lexical::Content::parse_i64 for convenience, so it
is available even when you don’t have the trait imported.
§Performance considerations
This implementation is faster than lexical::parse_i64 because it is optimized for the
fixed-size buffer case and does not need to handle the possibility that the number text
might be split across multiple buffers. It never allocates or copies.
§Example
use bufjson::lexical::{Token, fixed::FixedAnalyzer};
let mut an = FixedAnalyzer::new(&b"[123]"[..]);
assert_eq!(Token::ArrBegin, an.next());
assert_eq!(Token::Num, an.next());
assert_eq!(Ok(123), an.content().parse_i64());
assert_eq!(Token::ArrEnd, an.next());Sourcepub fn parse_u64(&self) -> Result<u64, NumError>
Available on crate feature num only.
pub fn parse_u64(&self) -> Result<u64, NumError>
num only.Converts the token content to a 64-bit unsigned integer.
This is an inherent implementation of lexical::Content::parse_u64 for convenience, so it
is available even when you don’t have the trait imported.
§Performance considerations
This implementation is faster than lexical::parse_u64 because it is optimized for the
fixed-size buffer case and does not need to handle the possibility that the number text
might be split across multiple buffers. It never allocates or copies.
§Example
use bufjson::lexical::{Token, fixed::FixedAnalyzer};
let mut an = FixedAnalyzer::new(&b"[123]"[..]);
assert_eq!(Token::ArrBegin, an.next());
assert_eq!(Token::Num, an.next());
assert_eq!(Ok(123), an.content().parse_u64());
assert_eq!(Token::ArrEnd, an.next());Sourcepub fn parse_i128(&self) -> Result<i128, NumError>
Available on crate feature num_ext only.
pub fn parse_i128(&self) -> Result<i128, NumError>
num_ext only.Converts the token content to a 128-bit signed integer.
This is an inherent implementation of lexical::Content::parse_i128 for convenience, so
it is available even when you don’t have the trait imported.
§Performance considerations
This method is faster than lexical::parse_i128 because it is optimized for the
fixed-size buffer case and does not need to handle the possibility that the number text
might be split across multiple buffers. It never allocates or copies.
§Example
use bufjson::lexical::{Token, fixed::FixedAnalyzer};
const TEXT: &str = r#"{"10^38":100000000000000000000000000000000000000}"#;
let mut an = FixedAnalyzer::new(TEXT.as_bytes());
assert_eq!(Token::ObjBegin, an.next());
assert_eq!(Token::Str, an.next());
assert_eq!(Token::NameSep, an.next());
assert_eq!(Token::Num, an.next());
assert_eq!(Ok(10_i128.pow(38)), an.content().parse_i128());
assert_eq!(Token::ObjEnd, an.next());Sourcepub fn parse_f64(&self) -> Result<f64, NumError>
Available on crate feature num only.
pub fn parse_f64(&self) -> Result<f64, NumError>
num only.Converts the token content to a 64-bit IEEE double precision floating point number.
This is an inherent implementation of lexical::Content::parse_f64 for convenience, so it
is available even when you don’t have the trait imported.
§Performance considerations
This method is faster than lexical::parse_f64 because it is optimized for the fixed-size
buffer case and does not need to handle the possibility that the number text might be split
across multiple buffers. It never allocates or copies.
§Example
use bufjson::lexical::{Token, fixed::FixedAnalyzer};
let mut an = FixedAnalyzer::new(&br#"{"pi":3.14159}"#[..]);
assert_eq!(Token::ObjBegin, an.next());
assert_eq!(Token::Str, an.next());
assert_eq!(Token::NameSep, an.next());
assert_eq!(Token::Num, an.next());
assert_eq!(Ok(3.14159), an.content().parse_f64());
assert_eq!(Token::ObjEnd, an.next());Trait Implementations§
Source§impl<B: Deref<Target = [u8]> + Debug> Content for Content<B>
impl<B: Deref<Target = [u8]> + Debug> Content for Content<B>
Source§type Literal<'a> = &'a str
where
Self: 'a
type Literal<'a> = &'a str where Self: 'a
Source§fn literal<'a>(&'a self) -> Self::Literal<'a>
fn literal<'a>(&'a self) -> Self::Literal<'a>
Source§fn literal_len(&self) -> usize
fn literal_len(&self) -> usize
literal value.Source§fn is_escaped(&self) -> bool
fn is_escaped(&self) -> bool
Source§fn unescaped_cmp(&self, other: &str) -> Ordering
fn unescaped_cmp(&self, other: &str) -> Ordering
Source§fn parse_i64(&self) -> Result<i64, NumError>
fn parse_i64(&self) -> Result<i64, NumError>
num only.Source§fn parse_u64(&self) -> Result<u64, NumError>
fn parse_u64(&self) -> Result<u64, NumError>
num only.Auto Trait Implementations§
impl<B> Freeze for Content<B>
impl<B> RefUnwindSafe for Content<B>where
B: RefUnwindSafe,
impl<B> Send for Content<B>
impl<B> Sync for Content<B>
impl<B> Unpin for Content<B>
impl<B> UnsafeUnpin for Content<B>
impl<B> UnwindSafe for Content<B>where
B: RefUnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.