#![allow(unused_imports)]
#[doc(hidden)]
#[macro_export]
macro_rules! count {
(@subst $($x:tt)*) => (());
($($rest:expr),*) => (<[()]>::len(&[$($crate::count!(@subst $rest)),*]));
}
#[macro_export]
macro_rules! tuple {
($elem:expr; $n:expr) => {$crate::JanetTuple::with_default_elem($crate::Janet::from($elem), $n)};
($($val:expr),* $(,)?) => {{
const LEN: usize = $crate::count!($($val),*);
$crate::JanetTuple::builder(LEN)
$(.put($crate::Janet::from($val)))*
.finalize()
}};
}
#[macro_export]
macro_rules! array {
() => { $crate::JanetArray::new() };
($elem:expr; $n:expr) => {{
let mut arr = $crate::JanetArray::with_capacity($n);
(0..$n).for_each(|_| arr.push($crate::Janet::from($elem)));
arr
}};
($($val:expr),* $(,)?) => {{
const LEN: usize = $crate::count!($($val),*);
let mut arr = $crate::JanetArray::with_capacity(LEN);
$(arr.push($crate::Janet::from($val));)*
arr
}};
}
#[macro_export]
macro_rules! structs {
($($key:expr => $value:expr),* $(,)?) => {{
const LEN: usize = $crate::count!($($key),*);
$crate::JanetStruct::builder(LEN)
$(.put($crate::Janet::from($key), $crate::Janet::from($value)))*
.finalize()
}};
}
#[macro_export]
macro_rules! table {
() => ($crate::JanetTable::new());
($($key:expr => $value:expr),* $(,)?) => {{
const LEN: usize = $crate::count!($($key),*);
let mut table = $crate::JanetTable::with_capacity(LEN);
$(let _ = table.insert($crate::Janet::from($key), $crate::Janet::from($value));)*
table
}};
}
#[deprecated(since = "0.4.0", note = "use `declare_janet_mod` instead")]
#[macro_export]
macro_rules! janet_mod {
($mod_name:literal; $({$fn_name:literal, $fn:expr, $fn_doc:literal}),* $(,)?) => {
#[no_mangle]
pub unsafe extern "C-unwind" fn _janet_mod_config() -> $crate::lowlevel::JanetBuildConfig {
$crate::lowlevel::JanetBuildConfig {
major: $crate::lowlevel::JANET_VERSION_MAJOR,
minor: $crate::lowlevel::JANET_VERSION_MINOR,
patch: $crate::lowlevel::JANET_VERSION_PATCH,
bits: $crate::lowlevel::JANET_CURRENT_CONFIG_BITS,
}
}
#[no_mangle]
pub unsafe extern "C-unwind" fn _janet_init(env: *mut $crate::lowlevel::JanetTable) {
$crate::lowlevel::janet_cfuns(env, concat!($mod_name, "\0").as_ptr() as *const _, [
$(
$crate::lowlevel::JanetReg {
name: concat!($fn_name, "\0").as_ptr() as *const _,
cfun: Some($fn),
documentation: concat!($fn_doc, "\0").as_ptr() as *const _,
},
)*
$crate::lowlevel::JanetReg {
name: std::ptr::null(),
cfun: None,
documentation: std::ptr::null(),
},
].as_ptr())
}
};
}
#[cfg(not(feature = "std"))]
#[macro_export]
macro_rules! jpanic {
() => {
$crate::util::_panic($crate::Janet::from("explicit panic"))
};
($($arg:tt)+) => {
$crate::util::_panic($crate::Janet::from(::alloc::format!($($arg)+).as_str()))
};
}
#[cfg(feature = "std")]
#[macro_export]
macro_rules! jpanic {
() => {
$crate::util::_panic($crate::Janet::from("explicit panic"))
};
($($arg:tt)+) => {
$crate::util::_panic($crate::Janet::from(::std::format!($($arg)+).as_str()))
};
}
#[macro_export]
macro_rules! bad_slot {
($args:ident, $index:expr, $expected:expr) => {
$crate::jpanic!(
"bad slot #{}, expected {}, got {}",
$index,
$expected,
$args[$index].kind()
)
};
}
#[crate::cjvg("1.12.2")]
#[macro_export]
macro_rules! jcatch {
($e:expr) => {{
let mut state = $crate::function::JanetTryState::init();
if let Some(signal) = state.signal() {
if matches!(
signal,
$crate::JanetSignal::Ok | $crate::JanetSignal::Yield | $crate::JanetSignal::User9
) {
Ok($e)
} else {
Err(state.payload())
}
} else {
Err($crate::Janet::from("No fiber to run."))
}
}};
}
#[cfg(feature = "std")]
#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
#[macro_export]
macro_rules! jtry {
($e:expr) => {{
::std::panic::catch_unwind(|| $e).unwrap_or_else(|err| {
if let Some(err) = err.downcast_ref::<String>() {
$crate::jpanic!("{}", err);
} else {
$crate::jpanic!();
}
})
}};
}
#[macro_export]
macro_rules! assert_deep_eq {
($left:expr, $right:expr $(,)?) => {{
use $crate::DeepEq;
match (&$left, &$right) {
(left_val, right_val) => {
if !(left_val.deep_eq(right_val)) {
$crate::util::assert_deep_inner("==", &*left_val, &*right_val, ::core::option::Option::None);
}
}
}
}};
($left:expr, $right:expr, $($arg:tt)+) => {{
match (&$left, &$right) {
(left_val, right_val) => {
if !(left_val.deep_eq(right_val)) {
$crate::util::assert_deep_inner("==", &*left_val, &*right_val, ::core::option::Option::Some(::core::format_args!($($arg)+)));
}
}
}
}};
}
#[macro_export]
macro_rules! assert_deep_ne {
($left:expr, $right:expr $(,)?) => {{
use $crate::DeepEq;
match (&$left, &$right) {
(left_val, right_val) => {
if !(left_val.deep_ne(right_val)) {
$crate::util::assert_deep_inner("!=", &*left_val, &*right_val, ::core::option::Option::None);
}
}
}
}};
($left:expr, $right:expr, $($arg:tt)+) => {{
match (&$left, &$right) {
(left_val, right_val) => {
if !(left_val.deep_ne(right_val)) {
$crate::util::assert_deep_inner("!=", &*left_val, &*right_val, ::core::option::Option::Some(::core::format_args!($($arg)+)));
}
}
}
}};
}
pub(crate) use array;
pub(crate) use assert_deep_eq;
pub(crate) use assert_deep_ne;
pub(crate) use bad_slot;
pub(crate) use count;
pub(crate) use jcatch;
pub(crate) use jpanic;
#[cfg(feature = "std")]
pub(crate) use jtry;
pub(crate) use structs;
pub(crate) use table;
pub(crate) use tuple;
#[cfg(all(test, any(feature = "amalgation", feature = "link-system")))]
mod tests {
use crate::types::Janet;
#[test]
fn tuple0() -> Result<(), crate::client::Error> {
let _client = crate::client::JanetClient::init()?;
let t = tuple![0, 1, 2, 3, true, "hey"];
assert_eq!(t.len(), 6);
assert_eq!(t[0], &Janet::integer(0));
assert_eq!(t[1], &Janet::integer(1));
assert_eq!(t[2], &Janet::integer(2));
assert_eq!(t[3], &Janet::integer(3));
assert_eq!(t[4], &Janet::boolean(true));
assert_eq!(t[5], &Janet::from("hey"));
Ok(())
}
#[test]
fn tuple1() -> Result<(), crate::client::Error> {
let _client = crate::client::JanetClient::init()?;
let t = tuple!["123"; 3];
assert_eq!(t.len(), 3);
assert_eq!(t[0], &Janet::from("123"));
assert_eq!(t[1], &Janet::from("123"));
assert_eq!(t[2], &Janet::from("123"));
Ok(())
}
#[test]
fn array0() -> Result<(), crate::client::Error> {
let _client = crate::client::JanetClient::init()?;
let arr = array![];
assert!(arr.is_empty());
Ok(())
}
#[test]
fn array1() -> Result<(), crate::client::Error> {
let _client = crate::client::JanetClient::init()?;
let arr = array![0; 5];
assert_eq!(arr.len(), 5);
assert_eq!(arr[0], &Janet::integer(0));
assert_eq!(arr[1], &Janet::integer(0));
assert_eq!(arr[2], &Janet::integer(0));
assert_eq!(arr[3], &Janet::integer(0));
assert_eq!(arr[4], &Janet::integer(0));
Ok(())
}
#[test]
fn array2() -> Result<(), crate::client::Error> {
let _client = crate::client::JanetClient::init()?;
let arr = array![0, 10.0, 15.5, true, "abc"];
assert_eq!(arr.len(), 5);
assert_eq!(arr[0], &Janet::integer(0));
assert_eq!(arr[1], &Janet::number(10.0));
assert_eq!(arr[2], &Janet::number(15.5));
assert_eq!(arr[3], &Janet::boolean(true));
assert_eq!(arr[4], &Janet::from("abc"));
Ok(())
}
#[test]
fn structs() -> Result<(), crate::client::Error> {
let _client = crate::client::JanetClient::init()?;
let st = structs! {
1 => "one",
true => 1,
};
assert_eq!(st.len(), 2);
assert_eq!(st.get(1), Some(&Janet::from("one")));
assert_eq!(st.get(true), Some(&Janet::integer(1)));
Ok(())
}
#[test]
fn table() -> Result<(), crate::client::Error> {
let _client = crate::client::JanetClient::init()?;
let table = table! {};
assert!(table.is_empty());
let table = table! {
1 => "one",
true => 1,
};
assert_eq!(table.len(), 2);
assert_eq!(table.get(1), Some(&Janet::from("one")));
assert_eq!(table.get(true), Some(&Janet::integer(1)));
Ok(())
}
#[test]
fn empty() -> Result<(), crate::client::Error> {
let _client = crate::client::JanetClient::init()?;
let arr = array![];
let tup = tuple![];
let stru = structs! {};
let tab = table! {};
assert!(arr.is_empty());
assert!(tup.is_empty());
assert!(stru.is_empty());
assert!(tab.is_empty());
Ok(())
}
}