use crate::lang_types::*;
macro_rules! impl_into {
($f:literal $t:ty) => {
impl True<$t>
};
($t:ty) => {
impl Cast<$t>
}
}
macro_rules! expr_fn {
(
$(#[$doc:meta])*
$name:ident ( $arg_0:ident: $($force_0:literal)? $type_0:ty $(,$arg_n:ident: $($force_n:literal)? $type_n:ty)* ) => $fmt:literal as $output:ty
) => {
$(#[$doc])*
pub fn $name($arg_0: impl_into!($($force_0)? $type_0) $(,$arg_n: impl_into!($($force_n)? $type_n))*) -> $output {
<$output>::from_string(format!($fmt, Cast::<$type_0>::cast($arg_0).compile() $(,Cast::<$type_n>::cast($arg_n).compile())*))
}
#[allow(non_camel_case_types)]
pub trait $name {
$(#[$doc])*
fn $name(self, $($arg_n: impl_into!($($force_n)? $type_n)),*) -> $output;
}
impl<T: True<$type_0>> $name for T {
fn $name(self, $($arg_n: impl_into!($($force_n)? $type_n)),*) -> $output {
<$output>::from_string(format!($fmt, self.cast().compile() $(,Cast::<$type_n>::cast($arg_n).compile())*))
}
}
};
(
$(#[$doc:meta])*
$name:ident<$($generic:ident),*> ( $arg_0:ident: $($force_0:literal)? $type_0:ty $(,$arg_n:ident: $($force_n:literal)? $type_n:ty)* ) => $fmt:literal as $output:ty
) => {
$(#[$doc])*
pub fn $name<$($generic: Expr),*>($arg_0: impl_into!($($force_0)? $type_0) $(,$arg_n: impl_into!($($force_n)? $type_n))*) -> $output {
<$output>::from_string(format!($fmt, Cast::<$type_0>::cast($arg_0).compile() $(,Cast::<$type_n>::cast($arg_n).compile())*))
}
#[allow(non_camel_case_types)]
pub trait $name<$($generic: Expr),*> {
$(#[$doc])*
fn $name(self, $($arg_n: impl_into!($($force_n)? $type_n)),*) -> $output;
}
impl<$($generic: Expr),*, TYPE0: True<$type_0>> $name<$($generic),*> for TYPE0 {
fn $name(self, $($arg_n: impl_into!($($force_n)? $type_n)),*) -> $output {
<$output>::from_string(format!($fmt, self.cast().compile() $(,Cast::<$type_n>::cast($arg_n).compile())*))
}
}
};
(
$(#[$doc:meta])*
> $name:ident ( $arg_0:ident: $($force_0:literal)? $type_0:ty $(,$arg_n:ident: $($force_n:literal)? $type_n:ty)* ) => $fmt:literal as $output:ty
) => {
$(#[$doc])*
pub fn $name($arg_0: impl_into!($($force_0)? $type_0) $(,$arg_n: impl_into!($($force_n)? $type_n))*) -> $output {
<$output>::from_string(format!($fmt, Cast::<$type_0>::cast($arg_0).compile() $(,Cast::<$type_n>::cast($arg_n).compile())*))
}
};
(
$(#[$doc:meta])*
> $name:ident<T> ( $arg_0:ident: $($force_0:literal)? $type_0:ty $(,$arg_n:ident: $($force_n:literal)? $type_n:ty)* ) => $fmt:literal as $output:ty
) => {
$(#[$doc])*
pub fn $name<T: Expr>($arg_0: impl_into!($($force_0)? $type_0) $(,$arg_n: impl_into!($($force_n)? $type_n))*) -> $output {
<$output>::from_string(format!($fmt, Cast::<$type_0>::cast($arg_0).compile() $(,Cast::<$type_n>::cast($arg_n).compile())*))
}
};
}
macro_rules! impl_op {
(
$(#[$doc:meta])*
$op:ident :: $name:ident ( $type_0:ty => $cast_0:ty ) => $fmt:literal as $output:ty
) => {
impl std::ops::$op for $type_0 {
type Output = $output;
$(#[$doc])*
fn $name(self) -> $output {
<$output>::from_string(format!($fmt, Cast::<$cast_0>::cast(self).compile()))
}
}
};
(
$(#[$doc:meta])*
$op:ident :: $name:ident ( $type_0:ty => $cast_0:ty, $type_1:ty => $cast_1:ty ) => $fmt:literal as $output:ty
) => {
impl std::ops::$op<$type_1> for $type_0 {
type Output = $output;
$(#[$doc])*
fn $name(self, rhs: $type_1) -> $output {
<$output>::from_string(format!($fmt, Cast::<$cast_0>::cast(self).compile(), Cast::<$cast_1>::cast(rhs).compile()))
}
}
};
}
macro_rules! expr_op {
(
$(#[$doc:meta])*
$op:ident :: $name:ident ( $type_0:ty ) => $fmt:literal as $output:ty
) => {
impl_op!( $(#[$doc])* $op :: $name ( $type_0 => $type_0 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<$type_0> => $type_0 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<$type_0> => $type_0 ) => $fmt as $output );
};
(
$(#[$doc:meta])*
$op:ident :: $name:ident ( $type_0:ty, $type_1:ty ) => $fmt:literal as $output:ty
) => {
impl_op!( $(#[$doc])* $op :: $name ( $type_0 => $type_0 , $type_1 => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( $type_0 => $type_0 , Variable<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( $type_0 => $type_0 , VariableElement<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<$type_0> => $type_0 , $type_1 => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<$type_0> => $type_0 , Variable<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<$type_0> => $type_0 , VariableElement<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<$type_0> => $type_0 , $type_1 => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<$type_0> => $type_0 , Variable<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<$type_0> => $type_0 , VariableElement<$type_1> => $type_1 ) => $fmt as $output );
};
(
$(#[$doc:meta])*
$op:ident :: $name:ident ( $type_0:ty , # ) => $fmt:literal as $output:ty
) => {
impl_op!( $(#[$doc])* $op :: $name ( $type_0 => $type_0 , Number => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( $type_0 => $type_0 , Variable<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( $type_0 => $type_0 , VariableElement<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<$type_0> => $type_0 , Number => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<$type_0> => $type_0 , Variable<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<$type_0> => $type_0 , VariableElement<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<$type_0> => $type_0 , Number => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<$type_0> => $type_0 , Variable<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<$type_0> => $type_0 , VariableElement<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( $type_0 => $type_0 , i8 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( $type_0 => $type_0 , i16 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( $type_0 => $type_0 , i32 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( $type_0 => $type_0 , i64 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( $type_0 => $type_0 , i128 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( $type_0 => $type_0 , isize => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( $type_0 => $type_0 , u8 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( $type_0 => $type_0 , u16 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( $type_0 => $type_0 , u32 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( $type_0 => $type_0 , u64 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( $type_0 => $type_0 , u128 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( $type_0 => $type_0 , usize => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( $type_0 => $type_0 , f32 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( $type_0 => $type_0 , f64 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<$type_0> => $type_0 , i8 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<$type_0> => $type_0 , i16 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<$type_0> => $type_0 , i32 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<$type_0> => $type_0 , i64 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<$type_0> => $type_0 , i128 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<$type_0> => $type_0 , isize => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<$type_0> => $type_0 , u8 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<$type_0> => $type_0 , u16 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<$type_0> => $type_0 , u32 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<$type_0> => $type_0 , u64 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<$type_0> => $type_0 , u128 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<$type_0> => $type_0 , usize => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<$type_0> => $type_0 , f32 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<$type_0> => $type_0 , f64 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<$type_0> => $type_0 , i8 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<$type_0> => $type_0 , i16 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<$type_0> => $type_0 , i32 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<$type_0> => $type_0 , i64 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<$type_0> => $type_0 , i128 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<$type_0> => $type_0 , isize => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<$type_0> => $type_0 , u8 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<$type_0> => $type_0 , u16 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<$type_0> => $type_0 , u32 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<$type_0> => $type_0 , u64 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<$type_0> => $type_0 , u128 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<$type_0> => $type_0 , usize => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<$type_0> => $type_0 , f32 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<$type_0> => $type_0 , f64 => Number ) => $fmt as $output );
};
(
$(#[$doc:meta])*
$op:ident :: $name:ident ( # , $type_1:ty ) => $fmt:literal as $output:ty
) => {
impl_op!( $(#[$doc])* $op :: $name ( Number => Number , $type_1 => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Number => Number , Variable<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Number => Number , VariableElement<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<Number> => Number , $type_1 => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<Number> => Number , Variable<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<Number> => Number , VariableElement<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<Number> => Number , $type_1 => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<Number> => Number , Variable<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<Number> => Number , VariableElement<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( i8 => Number , $type_1 => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( i16 => Number , $type_1 => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( i32 => Number , $type_1 => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( i64 => Number , $type_1 => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( i128 => Number , $type_1 => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( isize => Number , $type_1 => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( u8 => Number , $type_1 => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( u16 => Number , $type_1 => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( u32 => Number , $type_1 => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( u64 => Number , $type_1 => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( u128 => Number , $type_1 => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( usize => Number , $type_1 => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( f32 => Number , $type_1 => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( f64 => Number , $type_1 => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( i8 => Number , Variable<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( i16 => Number , Variable<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( i32 => Number , Variable<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( i64 => Number , Variable<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( i128 => Number , Variable<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( isize => Number , Variable<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( u8 => Number , Variable<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( u16 => Number , Variable<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( u32 => Number , Variable<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( u64 => Number , Variable<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( u128 => Number , Variable<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( usize => Number , Variable<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( f32 => Number , Variable<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( f64 => Number , Variable<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( i8 => Number , VariableElement<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( i16 => Number , VariableElement<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( i32 => Number , VariableElement<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( i64 => Number , VariableElement<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( i128 => Number , VariableElement<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( isize => Number , VariableElement<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( u8 => Number , VariableElement<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( u16 => Number , VariableElement<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( u32 => Number , VariableElement<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( u64 => Number , VariableElement<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( u128 => Number , VariableElement<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( usize => Number , VariableElement<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( f32 => Number , VariableElement<$type_1> => $type_1 ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( f64 => Number , VariableElement<$type_1> => $type_1 ) => $fmt as $output );
};
(
$(#[$doc:meta])*
$op:ident :: $name:ident ( # , # ) => $fmt:literal as $output:ty
) => {
impl_op!( $(#[$doc])* $op :: $name ( Number => Number , Number => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Number => Number , Variable<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Number => Number , VariableElement<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<Number> => Number , Number => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<Number> => Number , Variable<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<Number> => Number , VariableElement<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<Number> => Number , Number => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<Number> => Number , Variable<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<Number> => Number , VariableElement<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Number => Number , i8 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Number => Number , i16 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Number => Number , i32 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Number => Number , i64 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Number => Number , i128 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Number => Number , isize => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Number => Number , u8 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Number => Number , u16 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Number => Number , u32 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Number => Number , u64 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Number => Number , u128 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Number => Number , usize => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Number => Number , f32 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Number => Number , f64 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<Number> => Number , i8 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<Number> => Number , i16 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<Number> => Number , i32 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<Number> => Number , i64 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<Number> => Number , i128 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<Number> => Number , isize => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<Number> => Number , u8 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<Number> => Number , u16 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<Number> => Number , u32 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<Number> => Number , u64 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<Number> => Number , u128 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<Number> => Number , usize => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<Number> => Number , f32 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( Variable<Number> => Number , f64 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<Number> => Number , i8 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<Number> => Number , i16 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<Number> => Number , i32 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<Number> => Number , i64 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<Number> => Number , i128 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<Number> => Number , isize => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<Number> => Number , u8 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<Number> => Number , u16 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<Number> => Number , u32 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<Number> => Number , u64 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<Number> => Number , u128 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<Number> => Number , usize => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<Number> => Number , f32 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( VariableElement<Number> => Number , f64 => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( i8 => Number , Number => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( i16 => Number , Number => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( i32 => Number , Number => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( i64 => Number , Number => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( i128 => Number , Number => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( isize => Number , Number => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( u8 => Number , Number => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( u16 => Number , Number => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( u32 => Number , Number => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( u64 => Number , Number => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( u128 => Number , Number => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( usize => Number , Number => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( f32 => Number , Number => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( f64 => Number , Number => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( i8 => Number , Variable<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( i16 => Number , Variable<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( i32 => Number , Variable<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( i64 => Number , Variable<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( i128 => Number , Variable<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( isize => Number , Variable<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( u8 => Number , Variable<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( u16 => Number , Variable<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( u32 => Number , Variable<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( u64 => Number , Variable<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( u128 => Number , Variable<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( usize => Number , Variable<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( f32 => Number , Variable<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( f64 => Number , Variable<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( i8 => Number , VariableElement<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( i16 => Number , VariableElement<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( i32 => Number , VariableElement<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( i64 => Number , VariableElement<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( i128 => Number , VariableElement<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( isize => Number , VariableElement<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( u8 => Number , VariableElement<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( u16 => Number , VariableElement<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( u32 => Number , VariableElement<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( u64 => Number , VariableElement<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( u128 => Number , VariableElement<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( usize => Number , VariableElement<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( f32 => Number , VariableElement<Number> => Number ) => $fmt as $output );
impl_op!( $(#[$doc])* $op :: $name ( f64 => Number , VariableElement<Number> => Number ) => $fmt as $output );
};
}
macro_rules! expr_vl {
(
$(#[$doc:meta])*
$name:ident : $output:ty = $fmt:literal
) => {
$(#[$doc])*
#[allow(non_upper_case_globals)]
pub const $name: $output = <$output>::new($fmt);
};
}
expr_fn! { ability_charge(player: Player, button: Button) => "Ability Charge({}, {})" as Number }
expr_fn! { ability_cooldown(player: Player, button: Button) => "Ability Cooldown({}, {})" as Number }
expr_fn! { ability_icon_string(hero: Hero, button: Button) => "Ability Icon String({}, {})" as Text }
expr_fn! { ability_resource(player: Player, button: Button) => "Ability Cooldown({}, {})" as Number }
expr_fn! { absolute_value(value: true Number) => "Absolute Value({})" as Number }
expr_op! { Add::add(#, #) => "({} + {})" as Number }
expr_op! { Add::add(Vector, Vector) => "Add({}, {})" as Vector }
expr_vl! { AllDamageHeroes: Array<Hero> = "All Damage Heroes" }
expr_fn! { all_dead_players(team: Team) => "All Dead Players({})" as Array<Player> }
expr_vl! { AllHeroes: Array<Hero> = "All Heroes" }
expr_fn! { all_living_players(team: Team) => "All Living Players({})" as Array<Player> }
expr_fn! { all_players(team: Team) => "All Players({})" as Array<Player> }
expr_fn! { all_players_not_on_objective(team: Team) => "All Players Not On Objective({})" as Array<Player> }
expr_fn! { all_players_on_objective(team: Team) => "All Players On Objective({})" as Array<Player> }
expr_vl! { AllSupportHeroes: Array<Hero> = "All Support Heroes" }
expr_vl! { TankHeroes: Array<Hero> = "Tank Heroes" }
expr_fn! { allowed_heroes(player: Player) => "Allowed Heroes({})" as Array<Hero> }
expr_fn! { altitude(player: Player) => "Altitude Of({})" as Number }
expr_fn! { ammo(player: Player, clip: Number) => "Ammo({}, {})" as Number }
expr_op! { BitAnd::bitand(Boolean, Boolean) => "And({}, {})" as Boolean }
expr_fn! { angle_between(vector1: Vector, vector2: Vector) => "Angle Between Vectors({}, {})" as Number }
expr_fn! { angle_difference(angle1: Number, angle2: Number) => "Angle Difference({}, {})" as Number }
expr_fn! { append<T>(array: true Array<T>, value: true T) => "Append To Array({}, {})" as Array<T> }
expr_fn! { arccosine_in_degrees(value: Number) => "Arccosine In Degrees({})" as Number }
expr_fn! { arccosine_in_radians(value: Number) => "Arccosine In Radians({})" as Number }
expr_fn! { arcsine_in_degrees(value: Number) => "Arcsine In Degrees({})" as Number }
expr_fn! { arcsine_in_radians(value: Number) => "Arcsine In Radians({})" as Number }
expr_fn! { arctangent_in_degrees(value: Number) => "Arctangent In Degrees({})" as Number }
expr_fn! { arctangent_in_radians(value: Number) => "Arctangent In Radians({})" as Number }
#[macro_export]
macro_rules! array {
($type:ty ; $($arg:expr),*) => {
{
use ExprType::*;
Array<$type>::from_string(format!(
"Array({})",
vec![$(Cast::<$type>::cast($arg).take()),*].join(", ")
))
}
};
}
expr_fn! { contains<T>(array: true Array<T>, value: true T) => "Array Contains({}, {})" as Boolean }
expr_fn! { slice<T>(array: true Array<T>, start_index: true Number, count: true Number) => "Array Slice({}, {}, {})" as Array<T> }
expr_vl! { AssistCount: Number = "Assist Count" }
expr_vl! { Attacker: Player = "Attacker" }
expr_vl! { Backward: Vector = "Backward" }
expr_fn! { boolean(value: Boolean) => "{}" as Boolean }
expr_fn! { char_at_index(text: true Text, index: Number) => "Char In String({}, {})" as Text }
expr_fn! { closest_player(center: Vector, team: Team) => "Closest Player To({}, {})" as Player }
expr_fn! { equal<T>(value1: true Array<T>, value2: true Array<T>) => "({} == {})" as Boolean }
expr_fn! { not_equal<T>(value1: true Array<T>, value2: true Array<T>) => "({} != {})" as Boolean }
expr_fn! { less_than(value1: Number, value2: Number) => "({} < {})" as Boolean }
expr_fn! { less_than_or_equal(value1: Number, value2: Number) => "({} <= {})" as Boolean }
expr_fn! { greater_than(value1: Number, value2: Number) => "({} > {})" as Boolean }
expr_fn! { greater_than_or_equal(value1: Number, value2: Number) => "({} >= {})" as Boolean }
expr_fn! { control_mode_scoring_percentage(team: Team) => "Control Mode Scoring Percentage({})" as Number }
expr_vl! { ControlModeScoringTeam: Team = "Control Mode Scoring Team" }
expr_fn! { cosine_in_degrees(value: Number) => "Cosine From Degrees({})" as Number }
expr_fn! { cosine_in_radians(value: Number) => "Cosine From Radians({})" as Number }
expr_fn! { count<T>(array: true Array<T>) => "Count Of({})" as Number }
expr_fn! { cross(vector1: Vector, vector2: Vector) => "Cross Product({}, {})" as Vector }
expr_vl! { CurrentArrayElement: Expression = "Current Array Element" }
expr_vl! { CurrentArrayIndex: Number = "Current Array Index" }
expr_vl! { CurrentGameMode: GameMode = "Current Game Mode" }
expr_vl! { CurrentMap: Map = "Current Map" }
expr_fn! { > color(red: Number, green: Number, blue: Number, alpha: Number) => "Custom Color({}, {}, {}, {})" as Color }
#[macro_export]
macro_rules! fmt {
($fmt:literal) => {{
use ExprType::*;
Text::from_string(format!("Custom String({})", $fmt))
}};
($fmt:literal, $arg:expr) => {{
use ExprType::*;
Text::from_string(format!(
"Custom String({}, {})",
format!($fmt, "{0}"),
Cast::<Text>::cast($arg).take()
))
}};
($fmt:literal, $arg1:expr, $arg2:expr) => {{
use ExprType::*;
Text::from_string(format!(
"Custom String({}, {}, {})",
format!($fmt, "{0}", "{1}"),
Cast::<Text>::cast($arg1).take(),
Cast::<Text>::cast($arg2).take()
))
}};
($fmt:literal, $arg1:expr, $arg2:expr, $arg3:expr) => {{
use ExprType::*;
Text::from_string(format!(
"Custom String({}, {}, {}, {})",
format!($fmt, "{0}", "{1}", "{2}"),
Cast::<Text>::cast($arg1).take(),
Cast::<Text>::cast($arg2).take(),
Cast::<Text>::cast($arg3).take()
))
}};
}
expr_vl! { DamageModificationCount: Number = "Damage Modification Count" }
expr_vl! { DamageOverTimeCount: Number = "Damage Over Time Count" }
expr_fn! { > direction_from_angles(horizontal_angle: true Number, vertical_angle: true Number) => "Direction From Angles({}, {})" as Vector }
expr_fn! { direction_towards(start_pos: Vector, end_pos: Vector) => "Direction Towards({}, {})" as Vector }
expr_fn! { distance(vector1: Vector, vector2: Vector) => "Distance Between({}, {})" as Number }
expr_op! { Div::div(#, #) => "({} / {})" as Number }
expr_op! { Div::div(Vector, #) => "({} / {})" as Vector }
expr_op! { Div::div(Vector, Vector) => "({} / {})" as Vector }
expr_fn! { dot_product(vector1: Vector, vector2: Vector) => "Dot Product({}, {})" as Number }
expr_vl! { Down: Vector = "Down" }
expr_vl! { EntityCount: Number = "Entity Count" }
expr_fn! { exists(entity: Entity) => "Entity Exists({})" as Boolean }
expr_fn! { evaluate_once<T>(value: true T) => "Evaluate Once({})" as T }
expr_vl! { EventAbility: Button = "Event Ability" }
expr_vl! { EventDamage: Number = "Event Damage" }
expr_vl! { EventDirection: Vector = "Event Direction" }
expr_vl! { EventHealing: Number = "Event Healing" }
expr_vl! { EventPlayer: Player = "Event Player" }
expr_vl! { EventWasCriticalHit: Boolean = "Event Was Critical Hit" }
expr_vl! { EventWasEnvironment: Boolean = "Event Was Environment" }
expr_vl! { EventWasHealthPack: Boolean = "Event Was Health Pack" }
expr_fn! { eye_position(player: Player) => "Eye Position({})" as Vector }
expr_fn! { facing_direction(player: Player) => "Facing Direction Of({})" as Vector }
expr_fn! { farthest_player(center: Vector, team: Team) => "Farthest Player From({}, {})" as Player }
expr_fn! { filter<T>(array: true Array<T>, condition: true Boolean) => "Filtered Array({}, {})" as Array<T> }
expr_fn! { first<T>(array: true Array<T>) => "First Of({})" as T }
expr_fn! { flag_position(team: Team) => "Flag Position({})" as Vector }
expr_vl! { Forward: Vector = "Forward" }
expr_fn! { has_spawned(player: Player) => "Has Spawned({})" as Boolean }
expr_fn! { has_status(player: Player, status: true Status) => "Has Status({}, {})" as Boolean }
expr_vl! { HealOverTimeCount: Number = "Heal Over Time Count" }
expr_vl! { Healee: Player = "Healee" }
expr_vl! { Healer: Player = "Healer" }
expr_vl! { HealingModificationCount: Number = "Healing Modification Count" }
expr_fn! { health(player: Player) => "Health({})" as Number }
expr_fn! { health_of_type(player: Player, health_type: HealthType) => "Health({}, {})" as Number }
expr_fn! { hero_being_duplicated(player: Player) => "Hero Being Duplicated({})" as Hero }
expr_fn! { hero_icon_string(hero: Hero) => "Hero Icon String({})" as Text }
expr_fn! { hero(player: Player) => "Hero Of({})" as Hero }
expr_fn! { horizontal_angle(direction: true Vector) => "Horizontal Angle From Direction({})" as Number }
expr_fn! { horizontal_angle_towards(player: Player, position: Vector) => "Horizontal Angle Towards({}, {})" as Number }
expr_fn! { horizontal_facing_angle(player: Player) => "Horizontal Facing Angle Of({})" as Number }
expr_fn! { horizontal_speed(player: Player) => "Horizontal Speed Of({})" as Number }
expr_vl! { HostPlayer: Player = "Host Player" }
expr_fn! { > if_then_else<T>(condition: Boolean, value_if_true: true T, value_if_false: true T) => "If Then Else({}, {}, {})" as T }
expr_fn! { index_of_value<T>(array: true Array<T>, value: true T) => "Index Of({}, {})" as Number }
expr_fn! { index_of_char(text: Text, character: Text) => "Index Of({}, {})" as Number }
expr_fn! { input_binding_string(button: Button) => "Input Binding String({})" as Text }
expr_fn! { is_alive(player: Player) => "Is Alive({})" as Boolean }
expr_vl! { IsAssemblingHeroes: Boolean = "Is Assembling Heroes" }
expr_vl! { IsBetweenRounds: Boolean = "Is Between Rounds" }
expr_fn! { is_button_held(player: Player, button: Button) => "Is Button Held({}, {})" as Boolean }
expr_fn! { is_communicating(player: Player, interaction: Interaction) => "Is Communicating({}, {})" as Boolean }
expr_fn! { is_communicating_any(player: Player) => "Is Communicating Any({})" as Boolean }
expr_fn! { is_communicating_any_emote(player: Player) => "Is Communicating Any Emote({})" as Boolean }
expr_fn! { is_communicating_any_spray(player: Player) => "Is Communicating Any Spray({})" as Boolean }
expr_fn! { is_communicating_any_voice_line(player: Player) => "Is Communicating Any Voice Line({})" as Boolean }
expr_vl! { IsControlModePointLocked: Boolean = "Is Control Mode Point Locked" }
expr_fn! { is_crouching(player: Player) => "Is Crouching({})" as Boolean }
expr_vl! { IsCTFModeInSuddenDeath: Boolean = "Is CTF Mode In Sudden Death" }
expr_fn! { is_dead(player: Player) => "Is Dead({})" as Boolean }
expr_fn! { is_dummy_bot(player: Player) => "Is Dummy Bot({})" as Boolean }
expr_fn! { is_duplicating(player: Player) => "Is Duplicating({})" as Boolean }
expr_fn! { is_firing_primary(player: Player) => "Is Firing Primary({})" as Boolean }
expr_fn! { is_firing_secondary(player: Player) => "Is Firing Secondary({})" as Boolean }
expr_fn! { is_flag_at_base(team: Team) => "Is Flag At Base({})" as Boolean }
expr_fn! { is_flag_being_carried(team: Team) => "Is Flag Being Carried({})" as Boolean }
expr_vl! { IsGameInProgress: Boolean = "Is Game In Progress" }
expr_fn! { is_hero_being_played(hero: Hero, team: Team) => "Is Hero Being Played({}, {})" as Boolean }
expr_fn! { is_in_air(player: Player) => "Is In Air({})" as Boolean }
expr_fn! { is_in_alternate_form(player: Player) => "Is In Alternate Form({})" as Boolean }
expr_fn! { is_in_line_of_sight(player: Player, position: Vector, barriers: BarrierLOS) => "Is In Line Of Sight({}, {}, {})" as Boolean }
expr_vl! { IsInSetup: Boolean = "Is In Setup" }
expr_fn! { is_in_spawn_room(player: Player) => "Is In Spawn Room({})" as Boolean }
expr_fn! { is_in_view_angle(player: Player, location: Vector, view_angle: Number) => "Is In View Angle({}, {}, {})" as Boolean }
expr_fn! { is_jumping(player: Player) => "Is Jumping({})" as Boolean }
expr_vl! { IsMatchComplete: Boolean = "Is Match Complete" }
expr_fn! { is_meleing(player: Player) => "Is Meleing({})" as Boolean }
expr_fn! { is_moving(player: Player) => "Is Moving({})" as Boolean }
expr_fn! { > is_objective_complete(index: Number) => "Is Objective Complete({})" as Boolean }
expr_fn! { is_on_ground(player: Player) => "Is On Ground({})" as Boolean }
expr_fn! { is_on_objective(player: Player) => "Is On Objective({})" as Boolean }
expr_fn! { is_on_wall(player: Player) => "Is On Wall({})" as Boolean }
expr_fn! { is_portrait_on_fire(player: Player) => "Is Portrait On Fire({})" as Boolean }
expr_fn! { is_reloading(player: Player) => "Is Reloading({})" as Boolean }
expr_fn! { is_standing(player: Player) => "Is Standing({})" as Boolean }
expr_fn! { is_on_defense(team: Team) => "Is Team On Defense({})" as Boolean }
expr_fn! { is_on_offense(team: Team) => "Is Team On Offense({})" as Boolean }
expr_fn! { true_for_all<T>(array: true Array<T>, condition: true Boolean) => "Is True For All({}, {})" as Boolean }
expr_fn! { true_for_any<T>(array: true Array<T>, condition: true Boolean) => "Is True For Any({}, {})" as Boolean }
expr_fn! { is_using_ability_1(player: Player) => "Is Using Ability 1({})" as Boolean }
expr_fn! { is_using_ability_2(player: Player) => "Is Using Ability 2({})" as Boolean }
expr_fn! { is_using_ultimate(player: Player) => "Is Using Ultimate({})" as Boolean }
expr_vl! { IsWaitingForPlayers: Boolean = "Is Waiting For Players" }
expr_vl! { LastAssistID: Entity = "Last Assist ID" }
expr_vl! { LastCreatedEntity: Entity = "Last Created Entity" }
expr_vl! { LastCreatedHealthPool: Entity = "Last Created Health Pool" }
expr_vl! { LastDamageModificationID: Entity = "Last Damage Modification ID" }
expr_vl! { LastDamageOverTimeID: Entity = "Last Damage Over Time ID" }
expr_vl! { LastHealOverTimeID: Entity = "Last Heal Over Time ID" }
expr_vl! { LastHealingModificationID: Entity = "Last Healing Modification ID" }
expr_fn! { last<T>(array: true Array<T>) => "Last Of({})" as T }
expr_vl! { LastTextID: Entity = "Last Text ID" }
expr_vl! { Left: Vector = "Left" }
expr_vl! { LocalPlayer: Player = "Local Player" }
expr_fn! { local_vector(vector: Vector, player: Player, transformation: Transformation) => "Local Vector Of({}, {}, {})" as Vector }
expr_fn! { magnitude(vector: Vector) => "Magnitude Of({})" as Number }
expr_fn! { map<T, U>(array: true Array<T>, function: true U) => "Map({}, {})" as Array<U> }
expr_vl! { MatchRound: Number = "Match Round" }
expr_vl! { MatchTime: Number = "Match Time" }
expr_fn! { max(value1: true Number, value2: true Number) => "Max({}, {})" as Number }
expr_fn! { max_ammo(player: Player) => "Max Ammo({})" as Number }
expr_fn! { max_health(player: Player) => "Max Health({})" as Number }
expr_fn! { max_health_of_type(player: Player, health_type: HealthType) => "Max Health Of Type({}, {})" as Number }
expr_fn! { min(value1: true Number, value2: true Number) => "Min({}, {})" as Number }
expr_op! { Rem::rem(#, #) => "({} % {})" as Number }
expr_op! { Mul::mul(#, #) => "({} * {})" as Number }
expr_op! { Mul::mul(Vector, #) => "({} * {})" as Vector }
expr_op! { Mul::mul(#, Vector) => "({} * {})" as Vector }
expr_op! { Mul::mul(Vector, Vector) => "({} * {})" as Vector }
expr_fn! { nearest_walkable_position(position: Vector) => "Nearest Walkable Position({})" as Vector }
expr_fn! { normalize(vector: true Vector) => "Normalize({})" as Vector }
expr_fn! { normalized_health(player: Player) => "Normalized Health({})" as Number }
expr_op! { Not::not(Boolean) => "(!{})" as Boolean }
expr_vl! { Null: Expression = "Null" }
expr_fn! { number(value: Number) => "{}" as Number }
expr_fn! { number_of_dead_players(team: Team) => "Number Of Dead Players({})" as Number }
expr_fn! { number_of_deaths(player: Player) => "Number Of Deaths({})" as Number }
expr_fn! { number_of_eliminations(player: Player) => "Number Of Eliminations({})" as Number }
expr_fn! { number_of_final_blows(player: Player) => "Number Of Final Blows({})" as Number }
expr_fn! { number_of_heroes(hero: Hero, team: Team) => "Number Of Heroes({}, {})" as Number }
expr_fn! { number_of_living_players(team: Team) => "Number Of Living Players({})" as Number }
expr_fn! { number_of_players(team: Team) => "Number Of Players({})" as Number }
expr_fn! { number_of_players_on_objective(team: Team) => "Number Of Players On Objective({})" as Number }
expr_fn! { number_of_slots(team: Team) => "Number Of Slots({})" as Number }
expr_vl! { ObjectiveIndex: Number = "Objective Index" }
expr_fn! { objective_position(index: Number) => "Objective Position({})" as Vector }
expr_fn! { opposite_team(team: Team) => "Opposite Team Of({})" as Team }
expr_op! { BitOr::bitor(Boolean, Boolean) => "({} || {})" as Boolean }
expr_vl! { Origin: Vector = "Vector(0, 0, 0)" }
expr_vl! { PayloadPosition: Vector = "Payload Position" }
expr_vl! { PayloadProgressPercentage: Number = "Payload Progress Percentage" }
expr_fn! { player_carrying_flag(team: Team) => "Player Carrying Flag({})" as Player }
expr_fn! { player_closest_to_reticle(player: Player, team: Team) => "Player Closest To Reticle({}, {})" as Player }
expr_fn! { hero_statistic(player: Player, hero: Hero, stat: Statistic) => "Player Hero Stat({}, {}, {})" as Number }
expr_fn! { statistic(player: Player, stat: Statistic) => "Player Stat({}, {})" as Number }
expr_fn! { > players_in_slot(slot: Number, team: Team) => "Players In Slot({}, {})" as Array<Player> }
expr_fn! { players_in_view_angle(player: Player, team: Team, view_angle: Number) => "Players In View Angle({}, {}, {})" as Array<Player> }
expr_fn! { > players_on_hero(hero: Hero, team: Team) => "Players On Hero({}, {})" as Array<Player> }
expr_fn! { > players_within_radius(center: Vector, radius: Number, team: Team, los_check: LOS_Check) => "Players Within Radius({}, {}, {}, {})" as Array<Player> }
expr_vl! { PointCapturePercentage: Number = "Point Capture Percentage" }
expr_fn! { position(player: Player) => "Position Of({})" as Vector }
expr_fn! { raise_to_power(base: true Number, exponent: true Number) => "Raise To Power({}, {})" as Number }
expr_op! { BitXor::bitxor(Boolean, Boolean) => "({} ^ {})" as Boolean }
expr_fn! { random_integer(min: true Number, max: true Number) => "Random Integer({}, {})" as Number }
expr_fn! { random_real(min: true Number, max: true Number) => "Random Real({}, {})" as Number }
expr_fn! { random_value<T>(array: true Array<T>) => "Random Value In Array({})" as T }
expr_fn! { shuffle<T>(array: true Array<T>) => "Randomized Array({})" as Array<T> }
expr_fn! { ray_cast_hit_normal(start_pos: Vector, end_pos: Vector, included_players: Array<Player>, excluded_players: Array<Player>, include_player_owned_objects: Boolean) => "Ray Cast Hit Normal({}, {}, {}, {}, {})" as Vector }
expr_fn! { ray_cast_hit_player(start_pos: Vector, end_pos: Vector, included_players: Array<Player>, excluded_players: Array<Player>, include_player_owned_objects: Boolean) => "Ray Cast Hit Player({}, {}, {}, {}, {})" as Player }
expr_fn! { ray_cast_hit_position(start_pos: Vector, end_pos: Vector, included_players: Array<Player>, excluded_players: Array<Player>, include_player_owned_objects: Boolean) => "Ray Cast Hit Position({}, {}, {}, {}, {})" as Vector }
expr_fn! { remove_value<T>(array: true Array<T>, value: Array<T>) => "Remove From Array({}, {})" as Array<T> }
expr_vl! { Right: Vector = "Right" }
expr_fn! { round_to_integer(value: true Number) => "Round To Integer({})" as Number }
expr_fn! { score(player: Player) => "Score Of({})" as Number }
expr_vl! { ServerLoad: Number = "Server Load" }
expr_vl! { ServerLoadAverage: Number = "Server Load Average" }
expr_vl! { ServerLoadPeak: Number = "Server Load Peak" }
expr_fn! { sine_in_degrees(value: true Number) => "Sine From Degrees({})" as Number }
expr_fn! { sine_in_radians(value: true Number) => "Sine From Radians({})" as Number }
expr_fn! { slot(player: Player) => "Slot Of({})" as Number }
expr_fn! { sort<T>(array: true Array<T>, value_rank: Number) => "Sorted Array({}, {})" as Array<T> }
expr_fn! { spawn_points(team: Team) => "Spawn Points({})" as Array<Vector> }
expr_fn! { speed(player: Player) => "Speed Of({})" as Number }
expr_fn! { speed_in_direction(player: Player, direction: Vector) => "Speed Of In Direction({}, {})" as Number }
expr_fn! { square_root(value: true Number) => "Square Root({})" as Number }
expr_fn! { contains_substring(string: true Text, substring: true Text) => "String Contains({}, {})" as Boolean }
expr_fn! { length(string: true Text) => "String Length({})" as Number }
expr_fn! { replace(string: true Text, pattern: true Text, replacement: true Text) => "String Replace({}, {}, {})" as Text }
expr_fn! { substring(string: true Text, start_index: true Number, count: true Number) => "String Slice({}, {}, {})" as Text }
expr_fn! { split(string: true Text, delimiter: true Text) => "String Split({}, {})" as Array<Text> }
expr_op! { Sub::sub(#, #) => "({} - {})" as Number }
expr_op! { Sub::sub(Vector, Vector) => "({} - {})" as Vector }
expr_fn! { tangent_in_degrees(value: true Number) => "Tangent From Degrees({})" as Number }
expr_fn! { tangent_in_radians(value: true Number) => "Tangent From Radians({})" as Number }
expr_fn! { team(player: Player) => "Team Of({})" as Team }
expr_fn! { team_score(team: Team) => "Team Score({})" as Number }
expr_vl! { TextCount: Number = "Text Count" }
expr_fn! { throttle(player: Player) => "Thottle Of({})" as Vector }
expr_vl! { TotalTimeElapsed: Number = "Total Time Elapsed" }
expr_fn! { to_string<T>(value: true T) => "Custom String({})" as Text }
expr_fn! { ultimate_charge_percent(player: Player) => "Ultimate Charge Percent({})" as Number }
expr_vl! { Up: Vector = "Up" }
expr_fn! { update_every_frame<T>(value: true T) => "Update Every Frame({})" as T }
expr_fn! { value_at<T>(array: true Array<T>, index: Number) => "{}[{}]" as T }
expr_fn! { > vector(x: Number, y: Number, z: Number) => "Vector({}, {}, {})" as Vector }
expr_fn! { vector_towards(start_pos: Vector, end_pos: Vector) => "Vector Towards({}, {})" as Vector }
expr_fn! { velocity(player: Player) => "Velocity Of({})" as Vector }
expr_fn! { vertical_angle(direction: true Vector) => "Vertical Angle From Direction({})" as Number }
expr_fn! { vertical_angle_towards(player: Player, position: Vector) => "Vertical Angle Towards({}, {})" as Number }
expr_fn! { vertical_facing_angle(player: Player) => "Vertical Facing Angle Of({})" as Number }
expr_fn! { vertical_speed(player: Player) => "Vertical Speed Of({})" as Number }
expr_vl! { Victim: Player = "Victim" }
expr_fn! { weapon(player: Player) => "Weapon({})" as Number }
expr_fn! { > workshop_setting_combo(category: Text, name: Text, default_index: NumberLiteral, options: true Array<Text>, sort_order: NumberLiteral) => "Workshop Setting Combo({}, {}, {}, {}, {})" as Number }
expr_fn! { > workshop_setting_hero(category: Text, name: Text, default_value: HeroLiteral, sort_order: NumberLiteral) => "Workshop Setting Hero({}, {}, {}, {})" as Hero }
expr_fn! { > workshop_setting_integer(category: Text, name: Text, default_value: NumberLiteral, min_value: NumberLiteral, max_value: NumberLiteral, sort_order: NumberLiteral) => "Workshop Setting Integer({}, {}, {}, {}, {}, {})" as Number }
expr_fn! { > workshop_setting_real(category: Text, name: Text, default_value: NumberLiteral, min_value: NumberLiteral, max_value: NumberLiteral, sort_order: NumberLiteral) => "Workshop Setting Real({}, {}, {}, {}, {}, {})" as Number }
expr_fn! { > workshop_setting_toggle(category: Text, name: Text, default_value: BooleanLiteral, sort_order: NumberLiteral) => "Workshop Setting Toggle({}, {}, {}, {})" as Boolean }
expr_fn! { world_vector(vector: Vector, player: Player, transformation: Transformation) => "World Vector Of({}, {}, {})" as Vector }
expr_fn! { x_component(vector: true Vector) => "X Component Of({})" as Number}
expr_fn! { y_component(vector: true Vector) => "Y Component Of({})" as Number}
expr_fn! { z_component(vector: true Vector) => "Z Component Of({})" as Number}