ft_sys/
env.rs

1//! Functions to interact with the environment.
2
3unsafe extern "C" {
4    #[cfg(target_family = "wasm")]
5    fn env_print(ptr: i32, len: i32);
6    fn env_now() -> i32;
7    fn env_var(ptr: i32, len: i32) -> i32;
8    fn env_random() -> i32;
9}
10
11#[doc(hidden)]
12#[cfg(target_family = "wasm")]
13pub fn print_it(s: String) {
14    let (ptr, len) = ft_sys::memory::string_to_bytes_ptr(s);
15    unsafe { env_print(ptr, len) }
16}
17
18#[doc(hidden)]
19#[cfg(not(target_family = "wasm"))]
20pub fn print_it(s: String) {
21    println!("{s}");
22}
23
24/// Print some data to the server log.
25///
26/// This is similar to `println!` in Rust.
27#[macro_export]
28macro_rules! println {
29    ($($t:tt)*) => {{
30        $crate::env::print_it(format!($($t)*))
31    }};
32}
33
34/// Get the current time in UTC.
35pub fn now() -> chrono::DateTime<chrono::Utc> {
36    let ptr = unsafe { env_now() };
37    ft_sys::memory::json_from_ptr(ptr)
38}
39
40/// Read an environment variable. If the environment variable is not set, this
41/// returns `None`.
42pub fn var(name: String) -> Option<String> {
43    let (ptr, len) = ft_sys::memory::string_to_bytes_ptr(name);
44    let ptr = unsafe { env_var(ptr, len) };
45    ft_sys::memory::json_from_ptr(ptr)
46}
47
48/// Generate a random number between 0 and 1.
49pub fn random() -> f64 {
50    let ptr = unsafe { env_random() };
51    ft_sys::memory::json_from_ptr(ptr)
52}