Skip to content

Another round of docs fix + cleanups #95

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Nov 1, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ repository = "https://github.com/cloudevents/sdk-rust"
exclude = [
".github/*"
]
categories = ["web-programming", "encoding", "data-structures"]

[lib]
name = "cloudevents"
Expand All @@ -36,6 +37,7 @@ uuid = { version = "^0.8", features = ["v4", "wasm-bindgen"] }
[dev-dependencies]
rstest = "0.6"
claim = "0.3.1"
version-sync = "^0.9"

[workspace]
members = [
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ Note: This project is WIP under active development, hence all APIs are considere
To get started, add the dependency to `Cargo.toml`:

```toml
[dependencies]
cloudevents-sdk = "0.2.0"
```

Expand All @@ -43,8 +44,7 @@ let event = EventBuilderV10::new()
.id("aaa")
.source(Url::parse("http://localhost").unwrap())
.ty("example.demo")
.build()
.unwrap();
.build()?;
```

Checkout the examples using our integrations to learn how to send and receive events:
Expand Down
4 changes: 3 additions & 1 deletion cloudevents-sdk-actix-web/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ description = "CloudEvents official Rust SDK - Actix-Web integration"
documentation = "https://docs.rs/cloudevents-sdk-actix-web"
repository = "https://github.com/cloudevents/sdk-rust"
readme = "README.md"
categories = ["web-programming", "encoding", "web-programming::http-server"]

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

Expand All @@ -23,4 +24,5 @@ futures = "^0.3"
[dev-dependencies]
url = { version = "^2.1", features = ["serde"] }
serde_json = "^1.0"
chrono = { version = "^0.4", features = ["serde"] }
chrono = { version = "^0.4", features = ["serde"] }
version-sync = "^0.9"
7 changes: 5 additions & 2 deletions cloudevents-sdk-actix-web/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
//! To deserialize an HTTP request as CloudEvent:
//!
//! ```
//! use cloudevents_sdk_actix_web::RequestExt;
//! use cloudevents_sdk_actix_web::HttpRequestExt;
//! use actix_web::{HttpRequest, web, post};
//!
//! #[post("/")]
Expand Down Expand Up @@ -41,14 +41,17 @@
//!
//! Check out the [cloudevents-sdk](https://docs.rs/cloudevents-sdk) docs for more details on how to use [`cloudevents::Event`]

#![doc(html_root_url = "https://docs.rs/cloudevents-sdk-actix-web/0.2.0")]
#![deny(broken_intra_doc_links)]

#[macro_use]
mod headers;
mod server_request;
mod server_response;

pub use server_request::request_to_event;
pub use server_request::HttpRequestDeserializer;
pub use server_request::RequestExt;
pub use server_request::HttpRequestExt;
pub use server_response::event_to_response;
pub use server_response::HttpResponseBuilderExt;
pub use server_response::HttpResponseSerializer;
13 changes: 11 additions & 2 deletions cloudevents-sdk-actix-web/src/server_request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -113,16 +113,19 @@ pub async fn request_to_event(
}

/// Extention Trait for [`HttpRequest`] which acts as a wrapper for the function [`request_to_event()`].
///
/// This trait is sealed and cannot be implemented for types outside of this crate.
#[async_trait(?Send)]
pub trait RequestExt {
pub trait HttpRequestExt: private::Sealed {
/// Convert this [`HttpRequest`] into an [`Event`].
async fn to_event(
&self,
mut payload: web::Payload,
) -> std::result::Result<Event, actix_web::error::Error>;
}

#[async_trait(?Send)]
impl RequestExt for HttpRequest {
impl HttpRequestExt for HttpRequest {
async fn to_event(
&self,
payload: web::Payload,
Expand All @@ -131,6 +134,12 @@ impl RequestExt for HttpRequest {
}
}

mod private {
// Sealing the RequestExt
pub trait Sealed {}
impl Sealed for actix_web::HttpRequest {}
}

#[cfg(test)]
mod tests {
use super::*;
Expand Down
13 changes: 11 additions & 2 deletions cloudevents-sdk-actix-web/src/server_response.rs
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,12 @@ pub async fn event_to_response(
.map_err(actix_web::error::ErrorBadRequest)
}

/// Extention Trait for [`HttpResponseBuilder`] which acts as a wrapper for the function [`event_to_response()`].
/// Extension Trait for [`HttpResponseBuilder`] which acts as a wrapper for the function [`event_to_response()`].
///
/// This trait is sealed and cannot be implemented for types outside of this crate.
#[async_trait(?Send)]
pub trait HttpResponseBuilderExt {
pub trait HttpResponseBuilderExt: private::Sealed {
/// Fill this [`HttpResponseBuilder`] with an [`Event`].
async fn event(
self,
event: Event,
Expand All @@ -95,6 +98,12 @@ impl HttpResponseBuilderExt for HttpResponseBuilder {
}
}

// Sealing the HttpResponseBuilderExt
mod private {
pub trait Sealed {}
impl Sealed for actix_web::dev::HttpResponseBuilder {}
}

#[cfg(test)]
mod tests {
use super::*;
Expand Down
9 changes: 9 additions & 0 deletions cloudevents-sdk-actix-web/tests/version_number.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#[test]
fn test_readme_deps() {
version_sync::assert_markdown_deps_updated!("README.md");
}

#[test]
fn test_html_root_url() {
version_sync::assert_html_root_url_updated!("src/lib.rs");
}
6 changes: 4 additions & 2 deletions cloudevents-sdk-rdkafka/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,20 @@ description = "CloudEvents official Rust SDK - Kafka integration"
documentation = "https://docs.rs/cloudevents-sdk-rdkafka"
repository = "https://github.com/cloudevents/sdk-rust"
readme = "README.md"
categories = ["web-programming", "encoding"]

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
bytes = "^0.5"
cloudevents-sdk = { version = "0.2.0", path = ".." }
lazy_static = "1.4.0"
rdkafka = { version = "^0.24", features = ["cmake-build"] }

rdkafka = { version = "^0.24", default-features = false }

[dev-dependencies]
url = { version = "^2.1" }
serde_json = "^1.0"
chrono = { version = "^0.4", features = ["serde"] }
futures = "0.3.5"
rdkafka = { version = "^0.24" }
version-sync = "^0.9"
13 changes: 11 additions & 2 deletions cloudevents-sdk-rdkafka/src/kafka_consumer_record.rs
Original file line number Diff line number Diff line change
Expand Up @@ -134,8 +134,10 @@ pub fn record_to_event(msg: &impl Message) -> Result<Event> {
MessageDeserializer::into_event(ConsumerRecordDeserializer::new(msg)?)
}

/// Extension Trait for [`Message`] which acts as a wrapper for the function [`record_to_event()`]
pub trait MessageExt {
/// Extension Trait for [`Message`] which acts as a wrapper for the function [`record_to_event()`].
///
/// This trait is sealed and cannot be implemented for types outside of this crate.
pub trait MessageExt: private::Sealed {
/// Generates [`Event`] from [`BorrowedMessage`].
fn to_event(&self) -> Result<Event>;
}
Expand All @@ -152,6 +154,13 @@ impl MessageExt for OwnedMessage {
}
}

mod private {
// Sealing the MessageExt
pub trait Sealed {}
impl Sealed for rdkafka::message::OwnedMessage {}
impl Sealed for rdkafka::message::BorrowedMessage<'_> {}
}

#[cfg(test)]
mod tests {
use super::*;
Expand Down
21 changes: 19 additions & 2 deletions cloudevents-sdk-rdkafka/src/kafka_producer_record.rs
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,9 @@ impl StructuredSerializer<MessageRecord> for MessageRecord {
}

/// Extension Trait for [`BaseRecord`] that fills the record with a [`MessageRecord`].
pub trait BaseRecordExt<'a, K: ToBytes + ?Sized> {
///
/// This trait is sealed and cannot be implemented for types outside of this crate.
pub trait BaseRecordExt<'a, K: ToBytes + ?Sized>: private::Sealed {
/// Fill this [`BaseRecord`] with a [`MessageRecord`].
fn message_record(
self,
Expand All @@ -112,7 +114,9 @@ impl<'a, K: ToBytes + ?Sized> BaseRecordExt<'a, K> for BaseRecord<'a, K, Vec<u8>
}

/// Extension Trait for [`FutureRecord`] that fills the record with a [`MessageRecord`].
pub trait FutureRecordExt<'a, K: ToBytes + ?Sized> {
///
/// This trait is sealed and cannot be implemented for types outside of this crate.
pub trait FutureRecordExt<'a, K: ToBytes + ?Sized>: private::Sealed {
/// Fill this [`FutureRecord`] with a [`MessageRecord`].
fn message_record(self, message_record: &'a MessageRecord) -> FutureRecord<'a, K, Vec<u8>>;
}
Expand All @@ -128,3 +132,16 @@ impl<'a, K: ToBytes + ?Sized> FutureRecordExt<'a, K> for FutureRecord<'a, K, Vec
self
}
}

mod private {
// Sealing the FutureRecordExt and BaseRecordExt
pub trait Sealed {}
impl<K: rdkafka::message::ToBytes + ?Sized, V: rdkafka::message::ToBytes> Sealed
for rdkafka::producer::FutureRecord<'_, K, V>
{
}
impl<K: rdkafka::message::ToBytes + ?Sized, V: rdkafka::message::ToBytes> Sealed
for rdkafka::producer::BaseRecord<'_, K, V>
{
}
}
19 changes: 11 additions & 8 deletions cloudevents-sdk-rdkafka/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,16 @@
//! use rdkafka::util::Timeout;
//! use cloudevents_sdk_rdkafka::{MessageRecord, FutureRecordExt};
//!
//! # async fn produce(producer: &FutureProducer, event: Event) {
//! let message_record = MessageRecord::from_event(event)
//! .expect("error while serializing the event");
//! # async fn produce(producer: &FutureProducer, event: Event) -> Result<(), Box<dyn std::error::Error>> {
//! let message_record = MessageRecord::from_event(event)?;
//!
//! producer.send(
//! FutureRecord::to("topic")
//! .key("some_event")
//! .message_record(&message_record),
//! Timeout::Never
//! ).await;
//!
//! # Ok(())
//! # }
//!
//! ```
Expand All @@ -32,22 +31,26 @@
//! use cloudevents_sdk_rdkafka::MessageExt;
//! use futures::StreamExt;
//!
//! # async fn consume(consumer: StreamConsumer<DefaultConsumerContext>) {
//! # async fn consume(consumer: StreamConsumer<DefaultConsumerContext>) -> Result<(), Box<dyn std::error::Error>> {
//! let mut message_stream = consumer.start();
//!
//! while let Some(message) = message_stream.next().await {
//! match message {
//! Err(e) => println!("Kafka error: {}", e),
//! Ok(m) => {
//! let event = m.to_event().expect("error while deserializing record to CloudEvent");
//! println!("Received Event: {:#?}", event);
//! consumer.commit_message(&m, CommitMode::Async).unwrap();
//! let event = m.to_event()?;
//! println!("Received Event: {}", event);
//! consumer.commit_message(&m, CommitMode::Async)?;
//! }
//! };
//! }
//! # Ok(())
//! # }
//! ```

#![doc(html_root_url = "https://docs.rs/cloudevents-sdk-rdkafka/0.2.0")]
#![deny(broken_intra_doc_links)]

#[macro_use]
mod headers;
mod kafka_consumer_record;
Expand Down
9 changes: 9 additions & 0 deletions cloudevents-sdk-rdkafka/tests/version_number.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#[test]
fn test_readme_deps() {
version_sync::assert_markdown_deps_updated!("README.md");
}

#[test]
fn test_html_root_url() {
version_sync::assert_html_root_url_updated!("src/lib.rs");
}
4 changes: 3 additions & 1 deletion cloudevents-sdk-reqwest/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ description = "CloudEvents official Rust SDK - Reqwest integration"
documentation = "https://docs.rs/cloudevents-sdk-reqwest"
repository = "https://github.com/cloudevents/sdk-rust"
readme = "README.md"
categories = ["web-programming", "encoding", "web-programming::http-client"]

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

Expand All @@ -27,4 +28,5 @@ mockito = "0.25.1"
tokio = { version = "^0.2", features = ["full"] }
url = { version = "^2.1" }
serde_json = "^1.0"
chrono = { version = "^0.4", features = ["serde"] }
chrono = { version = "^0.4", features = ["serde"] }
version-sync = "^0.9"
15 changes: 12 additions & 3 deletions cloudevents-sdk-reqwest/src/client_request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,13 +62,16 @@ impl StructuredSerializer<RequestBuilder> for RequestSerializer {
}
}

/// Method to fill a [`RequestBuilder`] with an [`Event`]
/// Method to fill a [`RequestBuilder`] with an [`Event`].
pub fn event_to_request(event: Event, request_builder: RequestBuilder) -> Result<RequestBuilder> {
BinaryDeserializer::deserialize_binary(event, RequestSerializer::new(request_builder))
}

/// Extention Trait for [`RequestBuilder`] which acts as a wrapper for the function [`event_to_request()`]
pub trait RequestBuilderExt {
/// Extension Trait for [`RequestBuilder`] which acts as a wrapper for the function [`event_to_request()`].
///
/// This trait is sealed and cannot be implemented for types outside of this crate.
pub trait RequestBuilderExt: private::Sealed {
/// Write in this [`RequestBuilder`] the provided [`Event`]. Similar to invoking [`Event`].
fn event(self, event: Event) -> Result<RequestBuilder>;
}

Expand All @@ -78,6 +81,12 @@ impl RequestBuilderExt for RequestBuilder {
}
}

// Sealing the RequestBuilderExt
mod private {
pub trait Sealed {}
impl Sealed for reqwest::RequestBuilder {}
}

#[cfg(test)]
mod tests {
use super::*;
Expand Down
11 changes: 10 additions & 1 deletion cloudevents-sdk-reqwest/src/client_response.rs
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,11 @@ pub async fn response_to_event(res: Response) -> Result<Event> {
}

/// Extension Trait for [`Response`] which acts as a wrapper for the function [`response_to_event()`].
///
/// This trait is sealed and cannot be implemented for types outside of this crate.
#[async_trait(?Send)]
pub trait ResponseExt {
pub trait ResponseExt: private::Sealed {
/// Convert this [`Response`] to [`Event`].
async fn into_event(self) -> Result<Event>;
}

Expand All @@ -121,6 +124,12 @@ impl ResponseExt for Response {
}
}

// Sealing the ResponseExt
mod private {
pub trait Sealed {}
impl Sealed for reqwest::Response {}
}

#[cfg(test)]
mod tests {
use super::*;
Expand Down
Loading