Skip to main content

Content

Struct Content 

Source
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>>

Source

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>

Source

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.

Source

pub fn literal_len(&self) -> usize

Returns the number of bytes in the literal value.

Source

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.

Source

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::Literal wrapping the borrow returned by literal, 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.
Source

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! 🌍""#));
Source

pub fn parse_i64(&self) -> Result<i64, NumError>

Available on crate feature 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());
Source

pub fn parse_u64(&self) -> Result<u64, NumError>

Available on crate feature 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());
Source

pub fn parse_i128(&self) -> Result<i128, NumError>

Available on crate feature 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());
Source

pub fn parse_f64(&self) -> Result<f64, NumError>

Available on crate feature 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: Clone + Deref<Target = [u8]> + Debug> Clone for Content<B>

Source§

fn clone(&self) -> Content<B>

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<B: Deref<Target = [u8]> + Debug> Content for Content<B>

Source§

type Literal<'a> = &'a str where Self: 'a

Type that contains the literal string of the token exactly as it appears in the JSON text.
Source§

fn literal<'a>(&'a self) -> Self::Literal<'a>

Returns the literal content of the token exactly as it appears in the JSON text. Read more
Source§

fn literal_len(&self) -> usize

Returns the number of bytes in the literal value.
Source§

fn is_escaped(&self) -> bool

Indicates whether the token content contains escape sequences. Read more
Source§

fn unescaped<'a>(&'a self) -> Unescaped<Self::Literal<'a>>

Returns a normalized version of literal with all escape sequences in the JSON text fully expanded. Read more
Source§

fn unescaped_cmp(&self, other: &str) -> Ordering

Compares the token content to another string, expanding embedded escape sequences. Read more
Source§

fn parse_i64(&self) -> Result<i64, NumError>

Available on crate feature num only.
Converts the token content to a 64-bit signed integer. Read more
Source§

fn parse_u64(&self) -> Result<u64, NumError>

Available on crate feature num only.
Converts the token content to a 64-bit unsigned integer. Read more
Source§

fn parse_i128(&self) -> Result<i128, NumError>

Available on crate feature num_ext only.
Converts the token content to a 128-bit signed integer. Read more
Source§

fn parse_f64(&self) -> Result<f64, NumError>

Available on crate feature num only.
Converts the token content to a 64-bit IEEE double precision floating point number. Read more
Source§

impl<B: Debug + Deref<Target = [u8]> + Debug> Debug for Content<B>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for Content<Vec<u8>>

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl<B: Deref<Target = [u8]> + Debug> Display for Content<B>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<B> Freeze for Content<B>

§

impl<B> RefUnwindSafe for Content<B>
where B: RefUnwindSafe,

§

impl<B> Send for Content<B>
where B: Sync + Send,

§

impl<B> Sync for Content<B>
where B: Sync + Send,

§

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> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows 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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .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
where Self: BorrowMut<B>, B: ?Sized,

Calls .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
where Self: AsRef<R>, R: ?Sized,

Calls .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
where Self: AsMut<R>, R: ?Sized,

Calls .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
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.