Functional Weave
Code in Python

subscriptions.trial-end@1.0.0

impl/rust.rs

1,457 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::add_days;  ← from dates.add-days ^1.0.0 · built alongside by fune

/// The last free day and the first charge date of a trial of `trial_days` days
/// starting on `start_date`. The start day counts as day one, so the last free
/// day is start + trial_days - 1 and the charge is the day after it.
///
/// # Panics
/// Panics if `trial_days` is negative or the start date is not a real ISO date.
pub fn trial_end(start_date: &str, trial_days: i64) -> TrialPeriod {
    if trial_days < 0 {
        panic!("trial days must not be negative, received {}", trial_days);
    }
    // add_days validates the start date even when there is no trial, so a
    // malformed date never slips through as the "first charge date".
    let first_charge_date = add_days(start_date, trial_days);
    let last_trial_day = if trial_days == 0 {
        None
    } else {
        Some(add_days(start_date, trial_days - 1))
    };
    TrialPeriod {
        last_trial_day,
        first_charge_date,
    }
}

pub fn trial_period_to_value(period: &TrialPeriod) -> Value {
    Value::obj(vec![
        (
            "lastTrialDay",
            match &period.last_trial_day {
                Some(day) => Value::str(day),
                None => Value::Null,
            },
        ),
        ("firstChargeDate", Value::str(&period.first_charge_date)),
    ])
}

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