OXYGENHUB
# 2f0b4b0651ea oxygen / vendor / iana-time-zone / src / tz_wasm32_emscripten.rs
887 B · Rust · last changed Strata: the cloud stores send through ureq, so every release target links 1 month ago source blame history raw
1
use crate::GetTimezoneError;
2
use std::ffi::CStr;
3
use std::os::raw::c_char;
4
use std::ptr::NonNull;
5
6
extern "C" {
7
    fn emscripten_run_script_string(script: *const c_char) -> *mut c_char;
8
}
9
10
pub(crate) fn get_timezone_inner() -> Result<String, GetTimezoneError> {
11
    const SCRIPT: &CStr = {
12
        match CStr::from_bytes_with_nul(
13
            "Intl.DateTimeFormat().resolvedOptions().timeZone\0".as_bytes(),
14
        ) {
15
            Ok(s) => s,
16
            Err(_) => panic!("Invalid UTF-8 data"),
17
        }
18
    };
19
20
    unsafe {
21
        NonNull::new(emscripten_run_script_string(SCRIPT.as_ptr()))
22
            .ok_or_else(|| GetTimezoneError::OsError)
23
            .and_then(|ptr| {
24
                CStr::from_ptr(ptr.as_ptr())
25
                    .to_owned()
26
                    .into_string()
27
                    .map_err(|_| GetTimezoneError::FailedParsingString)
28
            })
29
    }
30
}