Functional Weave
Code in TypeScript

time.countdown@1.0.0

impl/rust.rs

1,183 bytes · the Rust implementation · view raw

Imports name this capability’s declared dependencies, which fune builds next to it in your project; each one links to its page.

use super::funejson::Value;  ← the fune runtime: the JSON value the test vectors use; fune build keeps it only where a signature takes one

/// The time left until `until`, as a number and as a timer's text. A moment
/// is reached at `until` itself, as a JWT's exp is (RFC 7519 4.1.4), so
/// `now == until` is expired with nothing left.
pub fn countdown(until: i64, now: i64) -> Countdown {
    let seconds = if until > now { until - now } else { 0 };
    let h = seconds / 3600;
    let m = (seconds % 3600) / 60;
    let s = seconds % 60;
    let text = if h > 0 { format!("{}:{:02}:{:02}", h, m, s) } else { format!("{}:{:02}", m, s) };
    Countdown { expired: seconds == 0, seconds, text }
}

pub fn countdown_to_value(c: &Countdown) -> Value {
    Value::obj(vec![
        ("expired", Value::Bool(c.expired)),
        ("seconds", Value::Int(c.seconds)),
        ("text", Value::str(&c.text)),
    ])
}

fn whole(value: &Value, message: &str) -> i64 {
    match value {
        Value::Int(i) => *i,
        _ => panic!("{}", message),
    }
}

pub fn fune_vector(args: &[Value]) -> Value {
    let until = whole(&args[0], "until must be a whole number of seconds");
    let now = whole(&args[1], "now must be a whole number of seconds");
    countdown_to_value(&countdown(until, now))
}