No tarball for gmail
This commit is contained in:
commit
ba9cb2c7cd
1
.dockerignore
Normal file
1
.dockerignore
Normal file
@ -0,0 +1 @@
|
||||
target/
|
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/target
|
1
.rustfmt.toml
Normal file
1
.rustfmt.toml
Normal file
@ -0,0 +1 @@
|
||||
edition = "2021"
|
1120
Cargo.lock
generated
Normal file
1120
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
17
Cargo.toml
Normal file
17
Cargo.toml
Normal file
@ -0,0 +1,17 @@
|
||||
[package]
|
||||
name = "pubsub-rs"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[[bin]]
|
||||
name = "client"
|
||||
path = "src/client.rs"
|
||||
|
||||
[dependencies]
|
||||
tonic = "0.7"
|
||||
prost = "0.10"
|
||||
tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] }
|
||||
clap = { version = "3.2.14", features = ["derive"] }
|
||||
|
||||
[build-dependencies]
|
||||
tonic-build = "0.7"
|
14
Dockerfile
Normal file
14
Dockerfile
Normal file
@ -0,0 +1,14 @@
|
||||
FROM rust as builder
|
||||
|
||||
WORKDIR /opt/pubsub-client
|
||||
|
||||
COPY . .
|
||||
|
||||
RUN apt update
|
||||
RUN apt install -y cmake
|
||||
RUN cargo build --release
|
||||
|
||||
FROM rust
|
||||
WORKDIR /opt/
|
||||
COPY --from=builder /opt/pubsub-client/target/release/client .
|
||||
ENTRYPOINT ["/opt/client"]
|
77
README.md
Normal file
77
README.md
Normal file
@ -0,0 +1,77 @@
|
||||
# PubSub client
|
||||
|
||||
## Quick and easy
|
||||
1. run `sudo docker build -t client .`
|
||||
2. run `sudo docker run --rm --network=host -it client publish topic message`
|
||||
2. run `sudo docker run --rm --network=host -it client consume topic`
|
||||
|
||||
## With Cargo
|
||||
1. run `cargo build --release`
|
||||
2. run `./target/release/client publish topic message`
|
||||
2. run `./target/release/client consume topic`
|
||||
|
||||
|
||||
## CLI
|
||||
Note that there are a few changes in the CLI interface as opposed to what's in
|
||||
the email. Please see `--help` for details.
|
||||
|
||||
Examples (binary named client):
|
||||
Publish a message
|
||||
`client publish mytopic mymessage`
|
||||
|
||||
Consume a message (default timeout of 10s)
|
||||
`client consume mytopic`
|
||||
|
||||
Consume a message with given timeout (seconds)
|
||||
`client consume mytopic -t 15`
|
||||
|
||||
|
||||
```
|
||||
$ ./target/release/client --help
|
||||
pubsub-rs 0.1.0
|
||||
|
||||
USAGE:
|
||||
client [OPTIONS] <SUBCOMMAND>
|
||||
|
||||
OPTIONS:
|
||||
-e, --endpoint <ENDPOINT> [default: localhost]
|
||||
-h, --help Print help information
|
||||
-p, --port <PORT> [default: 50051]
|
||||
--protocol <PROTOCOL> [default: tcp] [possible values: http, tcp]
|
||||
-V, --version Print version information
|
||||
|
||||
SUBCOMMANDS:
|
||||
consume
|
||||
help Print this message or the help of the given subcommand(s)
|
||||
publish
|
||||
```
|
||||
|
||||
Publish:
|
||||
```
|
||||
client-publish
|
||||
|
||||
USAGE:
|
||||
client publish <TOPIC> <MESSAGE>
|
||||
|
||||
ARGS:
|
||||
<TOPIC>
|
||||
<MESSAGE>
|
||||
|
||||
OPTIONS:
|
||||
-h, --help Print help information
|
||||
```
|
||||
|
||||
Consume:
|
||||
```
|
||||
client-consume
|
||||
|
||||
USAGE:
|
||||
client consume [OPTIONS] <TOPIC>
|
||||
|
||||
ARGS:
|
||||
<TOPIC>
|
||||
|
||||
OPTIONS:
|
||||
-h, --help Print help information
|
||||
-t, --timeout <TIMEOUT> [default: 10]
|
||||
```
|
4
build.rs
Normal file
4
build.rs
Normal file
@ -0,0 +1,4 @@
|
||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
tonic_build::compile_protos("proto/pubsub.proto")?;
|
||||
Ok(())
|
||||
}
|
28
proto/pubsub.proto
Normal file
28
proto/pubsub.proto
Normal file
@ -0,0 +1,28 @@
|
||||
syntax = "proto3";
|
||||
package pubsub;
|
||||
|
||||
service PubSub {
|
||||
|
||||
rpc Publish(PublishMessage) returns (PublishResponse) {}
|
||||
|
||||
rpc Consume(Consumer) returns (Message) {}
|
||||
|
||||
}
|
||||
|
||||
message PublishResponse {
|
||||
}
|
||||
|
||||
message Consumer {
|
||||
string topic = 1;
|
||||
uint64 timeout_ms = 2;
|
||||
}
|
||||
|
||||
message PublishMessage {
|
||||
string topic = 1;
|
||||
string message = 2;
|
||||
}
|
||||
|
||||
message Message {
|
||||
string message = 1;
|
||||
}
|
||||
|
84
src/client.rs
Normal file
84
src/client.rs
Normal file
@ -0,0 +1,84 @@
|
||||
use clap::Parser;
|
||||
use pubsub_client::pub_sub_client::PubSubClient;
|
||||
use pubsub_client::PublishMessage;
|
||||
use pubsub_client::Consumer;
|
||||
use std::fmt;
|
||||
use std::time::Duration;
|
||||
|
||||
pub mod pubsub_client {
|
||||
tonic::include_proto!("pubsub");
|
||||
}
|
||||
|
||||
#[derive(clap::ValueEnum, Clone, Debug)]
|
||||
enum Protocol {
|
||||
Http,
|
||||
Tcp,
|
||||
}
|
||||
|
||||
#[derive(clap::Subcommand, Debug)]
|
||||
enum Command {
|
||||
Publish { topic: String, message: String },
|
||||
Consume {
|
||||
topic: String,
|
||||
#[clap(short, long, default_value_t = 10)]
|
||||
timeout: u64},
|
||||
}
|
||||
|
||||
impl fmt::Display for Protocol {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
match self {
|
||||
Protocol::Http => write!(f, "http"),
|
||||
Protocol::Tcp => write!(f, "tcp"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Parser, Debug)]
|
||||
#[clap(author, version, about, long_about = None)]
|
||||
struct Cli {
|
||||
#[clap(short, long, value_parser, default_value_t = 50051)]
|
||||
port: u16,
|
||||
|
||||
#[clap(long, value_enum, default_value_t = Protocol::Tcp)]
|
||||
protocol: Protocol,
|
||||
|
||||
#[clap(short, long, value_parser, default_value = "localhost")]
|
||||
endpoint: String,
|
||||
|
||||
#[clap(subcommand)]
|
||||
command: Command,
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
let args = Cli::parse();
|
||||
|
||||
let mut client = PubSubClient::connect(format!(
|
||||
"{}://{}:{}",
|
||||
args.protocol, args.endpoint, args.port
|
||||
))
|
||||
.await?;
|
||||
|
||||
match args.command {
|
||||
Command::Consume { topic, timeout } => {
|
||||
let mut request = tonic::Request::new(Consumer { topic: topic.clone(), timeout_ms: timeout * 1000 });
|
||||
//Add 1s to the client-side timeout to let
|
||||
request.set_timeout(Duration::from_secs(timeout + 1));
|
||||
match client.consume(request).await {
|
||||
Err(e) => eprintln!("Error consuming {}\n{}", topic, e),
|
||||
Ok(msg) => println!("{}", msg.get_ref().message)
|
||||
}
|
||||
}
|
||||
Command::Publish { topic, message } => {
|
||||
let request = tonic::Request::new(PublishMessage {
|
||||
topic: topic.clone(),
|
||||
message: message.clone(),
|
||||
});
|
||||
if let Err(e) = client.publish(request).await {
|
||||
eprintln!("Error publishing {}:{}\n{}", topic, message, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
Loading…
Reference in New Issue
Block a user