11use cloud_pubsub:: error;
22use cloud_pubsub:: { Client , EncodedMessage , FromPubSubMessage } ;
3- use futures:: future:: lazy;
43use serde_derive:: Deserialize ;
5- use std:: sync:: Arc ;
6- use tokio:: prelude:: * ;
74
85#[ derive( Deserialize ) ]
96struct Config {
@@ -23,57 +20,35 @@ impl FromPubSubMessage for UpdatePacket {
2320 }
2421}
2522
26- fn main ( ) {
27- let parsed_env = envy :: from_env :: < Config > ( ) ;
28- if let Err ( e ) = parsed_env {
29- eprintln ! ( "ENV is not valid: {}" , e ) ;
30- std :: process :: exit ( 1 ) ;
31- }
32- let config = parsed_env . unwrap ( ) ;
23+ # [ tokio :: main]
24+ async fn main ( ) {
25+ let config : Config = envy :: from_env ( ) . expect ( "ENV is not valid" ) ;
26+
27+ let pubsub = Client :: new ( config . google_application_credentials )
28+ . await
29+ . expect ( "Failed to initialize pubsub" ) ;
3330
34- let pubsub = match Client :: new ( config. google_application_credentials ) {
35- Err ( e) => panic ! ( "Failed to initialize pubsub: {}" , e) ,
36- Ok ( p) => p,
37- } ;
31+ let topic = pubsub. topic ( config. topic ) ;
3832
39- let topic = Arc :: new ( pubsub . topic ( config . topic ) ) ;
33+ let sub = topic. subscribe ( ) . await . expect ( "Failed to subscribe" ) ;
4034
41- tokio:: run ( lazy ( move || {
42- topic
43- . subscribe ( )
44- . map ( |subscription| {
45- println ! ( "Subscribed to topic with: {}" , subscription. name) ;
46- let sub = Arc :: new ( subscription) ;
47- let get = sub
48- . clone ( )
49- . get_messages :: < UpdatePacket > ( )
50- . map ( move |( packets, acks) | {
51- for packet in packets {
52- println ! ( "Received: {:?}" , packet) ;
53- }
35+ println ! ( "Subscribed to topic with: {}" , sub. name) ;
36+ let ( packets, acks) = sub
37+ . clone ( )
38+ . get_messages :: < UpdatePacket > ( )
39+ . await
40+ . expect ( "Error Checking PubSub" ) ;
5441
55- if !acks. is_empty ( ) {
56- tokio:: spawn ( sub. acknowledge_messages ( acks) ) ;
57- } else {
58- println ! ( "Cleaning up" ) ;
59- if let Ok ( s) = Arc :: try_unwrap ( sub) {
60- let destroy = s
61- . destroy ( )
62- . map ( |_r| println ! ( "Successfully deleted subscription" ) )
63- . map_err ( |e| eprintln ! ( "Failed deleting subscription: {}" , e) )
64- . then ( move |_| {
65- drop ( pubsub) ;
66- Ok ( ( ) )
67- } ) ;
68- tokio:: spawn ( destroy) ;
69- } else {
70- eprintln ! ( "Subscription is still owned" ) ;
71- }
72- }
73- } )
74- . map_err ( |e| println ! ( "Error Checking PubSub: {}" , e) ) ;
75- tokio:: spawn ( get) ;
76- } )
77- . map_err ( |e| eprintln ! ( "Failed to subscribe: {}" , e) )
78- } ) ) ;
42+ for packet in packets {
43+ println ! ( "Received: {:?}" , packet) ;
44+ }
45+
46+ if !acks. is_empty ( ) {
47+ sub. acknowledge_messages ( acks) . await ;
48+ } else {
49+ println ! ( "Cleaning up" ) ;
50+ drop ( pubsub) ;
51+ sub. destroy ( ) . await . expect ( "Failed deleting subscription" ) ;
52+ println ! ( "Successfully deleted subscription" ) ;
53+ }
7954}
0 commit comments