//! Hedwig is a message bus library that works with arbitrary pubsub services such as AWS SNS/SQS
//! or Google Cloud Pubsub. Messages are validated before they are published. The publisher and
//! consumer are de-coupled and fan-out is supported out of the box.
//!
//! The Rust library currently only supports publishing.
//!
//! # Examples
//!
//! Publish a message. Payload encoded with JSON and validated using a JSON Schema.
//!
//! ```
//! use hedwig::{validators, Publisher, Consumer};
//! # use uuid::Uuid;
//! # use std::{path::Path, time::SystemTime};
//! # use futures_util::{sink::SinkExt, stream::StreamExt};
//! # #[cfg(not(all(feature = "protobuf", feature = "mock")))]
//! # fn main() {}
//! # #[cfg(all(feature = "protobuf", feature = "mock"))] // example uses a protobuf validator.
//! # #[tokio::main(flavor = "current_thread")]
//! # async fn main() -> Result<(), Box<dyn std::error::Error>> {
//!
//! #[derive(Clone, PartialEq, Eq, prost::Message)]
//! struct UserCreatedMessage {
//! #[prost(string, tag = "1")]
//! user_id: String,
//! }
//!
//! impl<'a> hedwig::EncodableMessage for UserCreatedMessage {
//! type Error = validators::ProstValidatorError;
//! type Validator = validators::ProstValidator;
//! fn topic(&self) -> hedwig::Topic {
//! "user.created".into()
//! }
//! fn encode(&self, validator: &Self::Validator) -> Result<hedwig::ValidatedMessage, Self::Error> {
//! Ok(validator.validate(
//! uuid::Uuid::new_v4(),
//! SystemTime::now(),
//! "user.created/1.0",
//! Default::default(),
//! self,
//! )?)
//! }
//! }
//!
//! impl hedwig::DecodableMessage for UserCreatedMessage {
//! type Error = validators::ProstDecodeError<validators::prost::SchemaMismatchError>;
//! type Decoder =
//! validators::ProstDecoder<validators::prost::ExactSchemaMatcher<UserCreatedMessage>>;
//!
//! fn decode(msg: hedwig::ValidatedMessage, decoder: &Self::Decoder) -> Result<Self, Self::Error> {
//! decoder.decode(msg)
//! }
//! }
//!
//!
//! let publisher = /* Some publisher */
//! # hedwig::mock::MockPublisher::new();
//! let consumer = /* Consumer associated to that publisher */
//! # publisher.new_consumer("user.created", "example_subscription");
//!
//! let mut publish_sink = Publisher::<UserCreatedMessage>::publish_sink(publisher, validators::ProstValidator::new());
//! let mut consumer_stream = consumer.consume::<UserCreatedMessage>(
//! validators::ProstDecoder::new(validators::prost::ExactSchemaMatcher::new("user.created/1.0")),
//! );
//!
//! publish_sink.send(UserCreatedMessage { user_id: String::from("U_123") }).await?;
//!
//! assert_eq!(
//! "U_123",
//! consumer_stream.next().await.unwrap()?.ack().await?.user_id
//! );
//!
//! # Ok(())
//! # }
//! ```
use ;
pub use Topic;
use Bytes;
use Uuid;
pub use *;
pub use *;
pub use *;
// TODO make these public somewhere?
pub const HEDWIG_ID: &str = "hedwig_id";
pub const HEDWIG_MESSAGE_TIMESTAMP: &str = "hedwig_message_timestamp";
pub const HEDWIG_SCHEMA: &str = "hedwig_schema";
pub const HEDWIG_PUBLISHER: &str = "hedwig_publisher";
pub const HEDWIG_FORMAT_VERSION: &str = "hedwig_format_version";
/// All errors that may be returned when operating top level APIs.
/// Custom headers associated with a message.
pub type Headers = ;
/// A validated message.
///
/// These are created by validators after encoding a user message, or when pulling messages from
/// the message service.
// derive Eq only in tests so that users can't foot-shoot an expensive == over data