enum RTypeCheck {
ScalarNumeric,
ScalarNonNeg,
Scalar(&'static str),
VectorNumeric,
VectorIntegerStrict,
VectorIntegerWide,
Vector(&'static str),
Nullable(Box<RTypeCheck>),
List,
}Expand description
Classification of an R-side type check for a function parameter.
Each variant maps to a specific set of stopifnot() assertions. Numeric checks
use a broad predicate (is.numeric || is.logical || is.raw) because R coerces
logical to numeric freely and raw to integer is valid for byte-sized types.
Borderline cases (e.g., raw to i64 in strict mode) pass the precondition and
reach Rust’s strict checker, which produces better contextual error messages.
Variants§
ScalarNumeric
Numeric scalar: type check + length-1 check (2 assertions).
Used for i32, f64, f32, i8, i16, i64, isize.
ScalarNonNeg
Non-negative numeric scalar: type + length-1 + >= 0 (3 assertions).
Used for u16, u32, u64, usize.
Scalar(&'static str)
Non-numeric scalar: is.<type>(x) + length-1 check (2 assertions).
The string is the R type predicate name (e.g., "logical", "character").
VectorNumeric
Floating-point numeric vector: loose is.numeric || is.logical || is.raw
(1 assertion). Used for Vec<f64> / Vec<f32> / &[f64] — doubles are
the natural representation, no truncation risk.
VectorIntegerStrict
INTSXP-only integer vector: is.integer(x) (1 assertion). Used only
for Vec<i32> / &[i32] (issue #616). These use the native RNativeType
inbound path (impl_vec_try_from_sexp_native!(i32)), which requires
INTSXP and rejects REALSXP outright. The loose is.numeric predicate
previously let a double like c(1, 2) pass the R gate only to fail with
a cryptic “expected INTSXP, got REALSXP”. is.integer(x) rejects every
double (whole or fractional) at the boundary with a clean message,
matching the actual Rust behaviour and closing the silent-truncation gap.
VectorIntegerWide
Wide integer vector accepting REALSXP whole-number values: the
lossless whole-number predicate (1 assertion). Used for every non-i32
integer element type — Vec<i8> / Vec<i16> / Vec<u16> / Vec<u32>
and the 64-bit family Vec<i64> / Vec<u64> / Vec<isize> / Vec<usize>
(issue #616). These use the coercing inbound path
(impl_vec_try_from_sexp_numeric! → from_numeric_vec_with) which accepts
INTSXP/REALSXP/RAWSXP/LGLSXP and rejects fractional doubles element-wise
(f64: TryCoerce<T> checks self.fract() != 0). We accept
integer/logical/raw and whole-number doubles, and reject genuinely
lossy fractional doubles (1.5) at the boundary.
Vector(&'static str)
Non-numeric vector: is.<type>(x) only (1 assertion).
The string is the R type predicate name.
Nullable(Box<RTypeCheck>)
Nullable wrapper around an inner check: prepends is.null(x) || to each assertion
and adjusts messages to mention NULL.
List
List check: is.list(x) (1 assertion).
Used for HashMap, BTreeMap, NamedList, List, ListMut.
Implementations§
Source§impl RTypeCheck
impl RTypeCheck
Sourcefn assertions(&self, param: &str) -> Vec<RAssertion>
fn assertions(&self, param: &str) -> Vec<RAssertion>
Produce the individual stopifnot() assertions for this type check.
Returns one or more RAssertion values, each representing a single
"message" = condition entry in the stopifnot() call. The param
argument is the R parameter name to use in messages and conditions.
Sourcefn coerced(self) -> Self
fn coerced(self) -> Self
Tighten the check for a coerced parameter.
#[miniextendr(coerce)] on an integer-element vector reads via the native
&[i32] slice (INTSXP-only), so a RTypeCheck::VectorIntegerWide that
would otherwise accept whole-number REALSXP must become a strict
is.integer gate (issue #616). Recurses through RTypeCheck::Nullable.
All other checks are unaffected. Type-sensitive tightening (e.g. bool,
whose logical gate must become an integer gate) lives in
coerce_tightened, which needs the declared Rust type.
Auto Trait Implementations§
impl Freeze for RTypeCheck
impl RefUnwindSafe for RTypeCheck
impl Send for RTypeCheck
impl Sync for RTypeCheck
impl Unpin for RTypeCheck
impl UnsafeUnpin for RTypeCheck
impl UnwindSafe for RTypeCheck
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> SizeHint for Twhere
T: ?Sized,
impl<T> SizeHint for Twhere
T: ?Sized,
Source§default fn lower_bound(&self) -> usize
default fn lower_bound(&self) -> usize
core_io_internals)[u8; 12] could return any value between 0 and
12 inclusively as a correct implementation. Read moreSource§impl<T> SizedTypeProperties for T
impl<T> SizedTypeProperties for T
Source§#[doc(hidden)]const SIZE: usize = _
#[doc(hidden)]const SIZE: usize = _
sized_type_properties)Source§#[doc(hidden)]const ALIGN: usize = _
#[doc(hidden)]const ALIGN: usize = _
sized_type_properties)Source§#[doc(hidden)]const ALIGNMENT: Alignment = _
#[doc(hidden)]const ALIGNMENT: Alignment = _
ptr_alignment_type)Source§#[doc(hidden)]const IS_ZST: bool = _
#[doc(hidden)]const IS_ZST: bool = _
sized_type_properties)Source§#[doc(hidden)]const LAYOUT: Layout = _
#[doc(hidden)]const LAYOUT: Layout = _
sized_type_properties)Source§#[doc(hidden)]const MAX_SLICE_LEN: usize = _
#[doc(hidden)]const MAX_SLICE_LEN: usize = _
sized_type_properties)[Self]. Read moreLayout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 24 bytes
Size for each variant:
ScalarNumeric: 0 bytesScalarNonNeg: 0 bytesScalar: 16 bytesVectorNumeric: 0 bytesVectorIntegerStrict: 0 bytesVectorIntegerWide: 0 bytesVector: 16 bytesNullable: 8 bytesList: 0 bytes