summer-pubsub 0.5.1

Integrate Google Cloud Pub/Sub (google-cloud-pubsub) with summer-rs
Documentation
use crate::handler::PubSubEnvelope;
use crate::message::Message;
use summer::app::App;
use summer::config::ConfigRegistry;
use summer::config::Configurable;
use summer::extractor::Component;
use summer::extractor::Config;
use summer::plugin::ComponentRegistry;

pub trait FromPubSubMsg: Sized {
    fn from_pubsub(
        grpc: &google_cloud_pubsub::model::Message,
        env: &PubSubEnvelope,
        app: &App,
    ) -> Self;
}

impl FromPubSubMsg for Message {
    fn from_pubsub(
        grpc: &google_cloud_pubsub::model::Message,
        env: &PubSubEnvelope,
        _app: &App,
    ) -> Self {
        Message::new(
            grpc.message_id.clone(),
            grpc.data.clone(),
            grpc.attributes.clone(),
            env.ack.clone(),
        )
    }
}

impl<T> FromPubSubMsg for Component<T>
where
    T: Clone + Send + Sync + 'static,
{
    fn from_pubsub(
        _grpc: &google_cloud_pubsub::model::Message,
        _env: &PubSubEnvelope,
        app: &App,
    ) -> Self {
        match app.get_component_ref::<T>() {
            Some(component) => Component(T::clone(&component)),
            None => panic!(
                "There is no component of `{}` type",
                std::any::type_name::<T>()
            ),
        }
    }
}

impl<T> FromPubSubMsg for Config<T>
where
    T: serde::de::DeserializeOwned + Configurable,
{
    fn from_pubsub(
        _grpc: &google_cloud_pubsub::model::Message,
        _env: &PubSubEnvelope,
        app: &App,
    ) -> Self {
        match app.get_config::<T>() {
            Ok(config) => Config(config),
            Err(e) => panic!(
                "get config failed for typeof {}: {}",
                std::any::type_name::<T>(),
                e
            ),
        }
    }
}