mit_commit_message_lints/relates/cmd/
set_relates_to.rs

1use std::{convert::TryInto, time::Duration};
2
3use miette::{miette, Result, WrapErr};
4use time::OffsetDateTime;
5
6use crate::{external::Vcs, relates::RelateTo};
7const CONFIG_KEY_EXPIRES: &str = "mit.relate.expires";
8
9/// # Errors
10///
11/// This errors if writing to the git mit file fails for some reason. Those
12/// reasons will be specific to VCS implementation
13pub fn set_relates_to(
14    config: &mut dyn Vcs,
15    relates: &RelateTo<'_>,
16    expires_in: Duration,
17) -> Result<()> {
18    set_vcs_relates_to(config, relates)?;
19    set_vcs_expires_time(config, expires_in)?;
20
21    Ok(())
22}
23
24fn set_vcs_relates_to(config: &mut dyn Vcs, relates: &RelateTo<'_>) -> Result<()> {
25    config.set_str("mit.relate.to", relates.to())?;
26    Ok(())
27}
28
29fn set_vcs_expires_time(config: &mut dyn Vcs, expires_in: Duration) -> Result<()> {
30    let now = OffsetDateTime::now_utc().unix_timestamp();
31    let expires_in_secs: i64 = expires_in
32        .as_secs()
33        .try_into()
34        .map_err(|_| miette!("Expiration time exceeds maximum supported value"))?;
35
36    let expiry_time = now
37        .checked_add(expires_in_secs)
38        .ok_or_else(|| miette!("Expiration time overflow"))?;
39
40    config
41        .set_i64(CONFIG_KEY_EXPIRES, expiry_time)
42        .wrap_err("failed to update the expiry time mit-relates-to")
43}