checkout_core 0.0.147

core traits and structs for the checkout_controller crate
Documentation
use std::time::Duration;
use tokio::{task, time};

use async_trait::async_trait;
use cloud_pubsub::Client;
use dropshot::{ApiDescription, ServerContext};

pub use checkout_server_derive::Server;

use crate::context::{ClientContext, ClientContextProvider};
use crate::error::Error;

#[async_trait]
pub trait Server<'a, C: ClientContext>: ClientContextProvider<'a, C> {
    type Context: ServerContext;
    fn api_description() -> ApiDescription<Self::Context>;
    async fn start(self) -> Result<(), Error>;
}

pub fn spawn_token_renew(client: &Client, interval: Duration) {
    let mut client = client.clone();
    let c = client.clone();
    let renew_token_task = async move {
        let mut int = time::interval(interval);
        loop {
            if c.is_running() {
                int.tick().await;
                let refresh = client.refresh_token();
                match time::timeout(Duration::from_secs(30), refresh).await {
                    Ok(result) => {
                        if let Err(e) = result {
                            eprintln!("Failed to update token: {}", e);
                        }
                    }
                    Err(_) => {
                        eprintln!("no refresh token response in 30 seconds")
                    }
                }
            }
        }
    };

    task::spawn(renew_token_task);
}