later 0.0.27

Distributed Background jobs manager and runner for Rust
Documentation
//! Checks the fallible decoder and documentation emitted by the job macro.
#![deny(missing_docs)]

use later::core::JobParameter;
use later::retry::{JobRetryPolicy, RetryBackoff, RetryPolicy};
use serde::{Deserialize, Serialize};

#[derive(Debug, Deserialize, Serialize)]
struct DecodeJob {
    value: String,
}

later::background_job! {
    struct DecodeServer {
        decode_job: DecodeJob,
    }
}

struct AppContext {
    extra_retries: usize,
}

#[later::async_trait::async_trait]
impl JobRetryPolicy for DecodeJob {
    type Context = AppContext;

    async fn retry_policy(&self, context: &AppContext) -> anyhow::Result<RetryPolicy> {
        Ok(RetryPolicy::fixed(
            self.value.len() + context.extra_retries,
            std::time::Duration::from_secs(3),
        ))
    }
}

#[test]
fn generated_payload_decode_returns_an_error() {
    let result = DecodeJob::try_from_bytes(b"not-message-pack");

    assert!(result.is_err());
}

#[test]
fn generated_payload_uses_an_async_context_retry_policy() {
    async_std::task::block_on(async {
        use later::retry::ResolveRetryPolicy as _;

        let message = DecodeJob {
            value: "ok".to_string(),
        };
        let context = AppContext { extra_retries: 3 };
        let resolver = later::retry::RetryPolicyResolver::new(&message, &context);
        let policy = (&resolver)
            .resolve_retry_policy()
            .await
            .expect("retry policy lookup succeeds")
            .expect("DecodeJob defines a retry policy");

        assert_eq!(policy.max_retries(), 5);
        assert_eq!(
            policy.backoff(),
            &RetryBackoff::Fixed {
                delay: std::time::Duration::from_secs(3),
            }
        );
    });
}