#![doc(html_logo_url = "https://raw.githubusercontent.com/V0ldek/rsonpath/main/img/rsonquery-logo.svg")]
#![cfg_attr(
not(debug_assertions),
warn(missing_docs, clippy::missing_errors_doc, clippy::missing_panics_doc,)
)]
#![cfg_attr(not(debug_assertions), warn(rustdoc::missing_crate_level_docs))]
#![warn(
explicit_outlives_requirements,
semicolon_in_expressions_from_macros,
unreachable_pub,
unused_import_braces,
unused_lifetimes
)]
#![warn(
clippy::allow_attributes_without_reason,
clippy::cargo_common_metadata,
clippy::cast_lossless,
clippy::cloned_instead_of_copied,
clippy::empty_drop,
clippy::empty_line_after_outer_attr,
clippy::equatable_if_let,
clippy::expl_impl_clone_on_copy,
clippy::explicit_deref_methods,
clippy::explicit_into_iter_loop,
clippy::explicit_iter_loop,
clippy::fallible_impl_from,
clippy::flat_map_option,
clippy::if_then_some_else_none,
clippy::inconsistent_struct_constructor,
clippy::large_digit_groups,
clippy::let_underscore_must_use,
clippy::manual_ok_or,
clippy::map_err_ignore,
clippy::map_unwrap_or,
clippy::match_same_arms,
clippy::match_wildcard_for_single_variants,
clippy::missing_inline_in_public_items,
clippy::mod_module_files,
clippy::must_use_candidate,
clippy::needless_continue,
clippy::needless_for_each,
clippy::needless_pass_by_value,
clippy::ptr_as_ptr,
clippy::redundant_closure_for_method_calls,
clippy::ref_binding_to_reference,
clippy::ref_option_ref,
clippy::rest_pat_in_fully_bound_structs,
clippy::undocumented_unsafe_blocks,
clippy::unneeded_field_pattern,
clippy::unseparated_literal_suffix,
clippy::unreadable_literal,
clippy::unused_self,
clippy::use_self
)]
#![warn(clippy::exit)]
#![cfg_attr(not(test), warn(clippy::panic, clippy::panic_in_result_fn, clippy::unwrap_used))]
#![cfg_attr(
not(debug_assertions),
warn(clippy::print_stderr, clippy::print_stdout, clippy::todo)
)]
#![cfg_attr(docsrs, feature(doc_cfg))]
pub mod classification;
mod depth;
pub mod engine;
pub mod error;
pub mod input;
pub mod query;
pub mod result;
cfg_if::cfg_if! {
if #[cfg(target_pointer_width = "32")] {
pub(crate) const BLOCK_SIZE: usize = 32;
pub(crate) type MaskType = u32;
}
else if #[cfg(target_pointer_width = "64")] {
pub(crate) const BLOCK_SIZE: usize = 64;
pub(crate) type MaskType = u64;
}
}
#[cfg(debug_assertions)]
#[allow(unused_macros)]
macro_rules! debug {
(target: $target:expr, $($arg:tt)+) => (log::debug!(target: $target, $($arg)+));
($($arg:tt)+) => (log::debug!($($arg)+))
}
#[allow(unused_macros)]
macro_rules! block {
($b:expr) => {
crate::debug!(
"{: >24}: {}",
"block",
std::str::from_utf8(
&$b.iter()
.map(|x| if x.is_ascii_whitespace() { b' ' } else { *x })
.collect::<Vec<_>>()
)
.unwrap_or("[INVALID UTF8]")
);
};
}
#[cfg(not(debug_assertions))]
#[allow(unused_macros)]
macro_rules! debug {
(target: $target:expr, $($arg:tt)+) => {};
($($arg:tt)+) => {};
}
#[allow(unused_macros)]
macro_rules! bin_u64 {
($name:expr, $e:expr) => {
$crate::debug!(
"{: >24}: {:064b} ({})",
$name,
{
let mut res = 0_u64;
for i in 0..64 {
let bit = (($e) & (1 << i)) >> i;
res |= bit << (63 - i);
}
res
},
$e
);
};
}
#[allow(unused_macros)]
macro_rules! bin_u32 {
($name:expr, $e:expr) => {
$crate::debug!(
"{: >24}: {:032b} ({})",
$name,
{
let mut res = 0_u32;
for i in 0..32 {
let bit = (($e) & (1 << i)) >> i;
res |= bit << (31 - i);
}
res
},
$e
);
};
}
#[allow(unused_imports)]
pub(crate) use bin_u32;
#[allow(unused_imports)]
pub(crate) use bin_u64;
#[allow(unused_imports)]
pub(crate) use block;
#[allow(unused_imports)]
pub(crate) use debug;
pub trait FallibleIterator {
type Item;
type Error: std::error::Error;
fn next(&mut self) -> Result<Option<Self::Item>, Self::Error>;
#[inline]
fn collect<B>(self) -> Result<B, Self::Error>
where
B: FromIterator<Self::Item>,
Self: Sized,
{
let iter = FallibleIntoIter { src: self };
iter.collect()
}
}
struct FallibleIntoIter<F> {
src: F,
}
impl<F: FallibleIterator> Iterator for FallibleIntoIter<F> {
type Item = Result<F::Item, F::Error>;
fn next(&mut self) -> Option<Self::Item> {
match self.src.next() {
Ok(item) => item.map(Ok),
Err(e) => Some(Err(e)),
}
}
}
pub(crate) const JSON_SPACE_BYTE: u8 = b' ';
pub(crate) const JSON_WHITESPACE_BYTES: [u8; 4] = [b' ', b'\t', b'\n', b'\r'];
#[inline(always)]
#[must_use]
pub(crate) fn is_json_whitespace(x: u8) -> bool {
JSON_WHITESPACE_BYTES.contains(&x)
}