urbit_http_api/
helper.rs

1use std::time::{SystemTime, UNIX_EPOCH};
2
3// `@ud` ~1970.1.1
4static DA_UNIX_EPOCH: u128 = 170141184475152167957503069145530368000;
5// `@ud` ~s1
6static DA_SECOND: u128 = 18446744073709551616;
7
8/// Convert from Unix time in milliseconds to Urbit `@da` time
9pub fn unix_time_to_da(unix_time: u64) -> u128 {
10    let time_since_epoch = (unix_time as u128 * DA_SECOND) / 1000;
11    DA_UNIX_EPOCH + time_since_epoch
12}
13
14/// Acquire the current time as u64
15pub fn get_current_time() -> u64 {
16    SystemTime::now()
17        .duration_since(UNIX_EPOCH)
18        .unwrap()
19        .as_millis() as u64
20}
21
22/// Acquire the current time in Urbit `@da` encoding
23pub fn get_current_da_time() -> u128 {
24    let unix_time = get_current_time();
25    unix_time_to_da(unix_time)
26}
27
28/// Encode an index path into urbit ud format
29/// /12345678901234/1/10987654321 -> /12.345.678.901.234/1/10.987.654.321
30pub fn index_dec_to_ud(index: &str) -> String {
31    // Split the index
32    let index_split: Vec<&str> = index.split("/").collect();
33    let mut udindex = String::new();
34    // Handle each segment
35    for i in 0..index_split.len() {
36        if index_split[i].len() > 0 {
37            let mut rev: String = index_split[i].chars().rev().collect();
38            let mut out = String::new();
39            while rev.len() >= 3 {
40                let chunk: String = rev.drain(..3).collect();
41                out += &chunk;
42                if rev.len() > 0 {
43                    out += ".";
44                }
45            }
46            out += &rev;
47            let seg: String = out.chars().rev().collect();
48            udindex += &format!("/{}", &seg);
49        }
50    }
51    udindex
52}