Functional Weave
Code in Rust

dates.age@1.0.0

impl/rust.rs

1,192 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
use super::dates_add_days::{is_leap_year, parse_iso_date};  ← from dates.add-days ^1.0.0 · built alongside by fune

/// Completed years on `on_date`. A person attains an age at the start of their
/// birthday; for a 29 February birthday in a year without one, the birthday is
/// taken to be 1 March (Age of Legal Capacity (Scotland) Act 1991 s.6(2), and
/// the UK reading of Family Law Reform Act 1969 s.9), not 28 February.
///
/// # Panics
/// Panics on a malformed or impossible date, or `on_date` before `birth_date`.
pub fn age(birth_date: &str, on_date: &str) -> i64 {
    let birth = parse_iso_date(birth_date);
    let on = parse_iso_date(on_date);
    if on_date < birth_date {
        panic!("onDate {} is before birthDate {}", on_date, birth_date);
    }
    let (mut birthday_month, mut birthday_day) = (birth.month, birth.day);
    if birth.month == 2 && birth.day == 29 && !is_leap_year(on.year) {
        birthday_month = 3;
        birthday_day = 1;
    }
    let mut years = on.year - birth.year;
    if (on.month, on.day) < (birthday_month, birthday_day) {
        years -= 1;
    }
    years
}

pub fn fune_vector(args: &[Value]) -> Value {
    Value::Int(age(args[0].as_str(), args[1].as_str()))
}