#![no_std]
#[macro_export]
macro_rules! ok {
($expr:expr) => {
match $expr {
Ok(ok) => Some(ok),
Err(_) => None,
}
};
}
#[macro_export]
macro_rules! slice {
($slicable:expr, $index:expr) => {{
let _ = $crate::__internal::SliceTypeCheck($slicable, $index);
$crate::__internal::Slice($slicable, $index).index()
}};
}
#[macro_export]
macro_rules! try_slice {
($slicable:expr, $index:expr) => {{
let _ = $crate::__internal::SliceTypeCheck($slicable, $index);
$crate::__internal::Slice($slicable, $index).get()
}};
}
#[macro_export]
macro_rules! slice_split_at {
($slicable:expr, $index:expr) => {{
let _: ::core::primitive::usize = $index;
$crate::__internal::Slice($slicable, $index).split()
}};
}
#[macro_export]
macro_rules! slice_try_split_at {
($slicable:expr, $index:expr) => {{
let _: ::core::primitive::usize = $index;
$crate::__internal::Slice($slicable, $index).try_split()
}};
}
#[doc(hidden)]
#[deprecated = "renamed to slice_split_at"]
#[macro_export]
macro_rules! split_slice_at {
($slicable:expr, $index:expr) => {{
$crate::slice_split_at!($slicable, $index)
}};
}
#[doc(hidden)]
#[deprecated = "renamed to slice_try_split_at"]
#[macro_export]
macro_rules! try_split_slice_at {
($slicable:expr, $index:expr) => {{
$crate::slice_try_split_at!($slicable, $index)
}};
}
#[macro_export]
macro_rules! slice_cmp {
($a:expr, $b:expr) => {
$crate::__internal::SliceRef($a).cmp($crate::__internal::SliceRef($b))
};
}
#[macro_export]
macro_rules! slice_partial_cmp {
($a:expr, $b:expr) => {
$crate::__internal::SliceRef($a).partial_cmp($crate::__internal::SliceRef($b))
};
}
#[macro_export]
macro_rules! slice_eq {
($a:expr, $b:expr) => {
::core::matches!(
$crate::slice_partial_cmp!($a, $b),
::core::option::Option::Some(::core::cmp::Ordering::Equal)
)
};
}
#[macro_export]
macro_rules! slice_starts_with {
($s:expr, $prefix:expr) => {
$crate::slice_strip_prefix!($s, $prefix).is_some()
};
}
#[macro_export]
macro_rules! slice_ends_with {
($s:expr, $prefix:expr) => {
$crate::slice_strip_suffix!($s, $prefix).is_some()
};
}
#[macro_export]
macro_rules! slice_strip_prefix {
($s:expr, $prefix:expr) => {{
let (slice, prefix) = (
$crate::__internal::SliceRef($s),
$crate::__internal::SliceRef($prefix),
);
if slice.len() >= prefix.len() {
let (pfx, rest) = $crate::slice_split_at!(slice.0, prefix.len());
if $crate::slice_eq!(pfx, prefix.0) {
Some(rest)
} else {
None
}
} else {
None
}
}};
}
#[macro_export]
macro_rules! slice_strip_suffix {
($s:expr, $suffix:expr) => {{
let (slice, suffix) = (
$crate::__internal::SliceRef($s),
$crate::__internal::SliceRef($suffix),
);
if slice.len() >= suffix.len() {
let (rest, suff) = $crate::slice_split_at!(slice.0, slice.len() - suffix.len());
if $crate::slice_eq!(suff, suffix.0) {
Some(rest)
} else {
None
}
} else {
None
}
}};
}
#[macro_export]
macro_rules! expect_ok {
($expr:expr) => {
match $expr {
::core::result::Result::Ok(value) => value,
::core::result::Result::Err(err) => panic!("{}", err),
}
};
($expr:expr, $message:expr) => {
match $expr {
::core::result::Result::Ok(value) => value,
::core::result::Result::Err(_) => panic!("{}", $message),
}
};
}
#[macro_export]
macro_rules! expect_some {
($expr:expr, $message:expr) => {
match $expr {
::core::option::Option::Some(value) => value,
::core::option::Option::None => panic!("{}", $message),
}
};
}
#[macro_export]
macro_rules! unwrap_ok {
($expr:expr) => {
$crate::expect_ok!($expr, "unwrapped Err value")
};
}
#[macro_export]
macro_rules! unwrap_some {
($expr:expr) => {
$crate::expect_some!($expr, "unwrapped None value")
};
}
#[macro_export]
macro_rules! unwrap_ok_or_return {
($expr:expr) => {
match $expr {
::core::result::Result::Ok(value) => value,
::core::result::Result::Err(err) => return ::core::result::Result::Err(err),
}
};
}
#[macro_export]
macro_rules! unwrap_some_or_return {
($expr:expr) => {
match $expr {
::core::option::Option::Some(value) => value,
::core::option::Option::None => return ::core::option::Option::None,
}
};
}
mod slice;
#[doc(hidden)]
pub mod __internal {
pub use super::slice::{Slice, SliceIndex, SliceRef, SliceTypeCheck};
}
#[cfg(test)]
mod tests;