/starling-webhooks

Starling Webhook V2 bindings

Primary LanguageRust

Starling Webhooks

Rust types for handling data from Starling Bank's webhook API.

Usage

The following example shows a basic HTTP server built with hyper and tokio that deserializes payload data at /feed-item into a WebhookFeedItem type and displays it in the debug format. All other routes return 404s.

The source for this example can be found in /examples/hyper-server with the dependencies and versions.

use std::convert::Infallible;
use std::net::{Ipv4Addr, SocketAddrV4};

use hyper::service::{make_service_fn, service_fn};
use hyper::{Body, Request, Response, Server};
use starling_webhooks::WebhookFeedItem;

async fn router(req: Request<Body>) -> Result<Response<Body>, Infallible> {
    let response = match req.uri().path() {
        "/feed-item" => handle_feed_item(req).await,
        _ => Response::builder().status(404).body(Body::empty()).unwrap(),
    };

    Ok(response)
}

async fn handle_feed_item(mut req: Request<Body>) -> Response<Body> {
    // Get the body itself
    let body = hyper::body::to_bytes(req.body_mut())
        .await
        .expect("Failed to get the body");

    // Deserialize it and display it
    let webhook: WebhookFeedItem =
        serde_json::from_slice(&body).expect("Failed to deserialize the content");

    dbg!(&webhook);

    Response::default()
}

#[tokio::main]
async fn main() {
    let service = make_service_fn(|_| async { Ok::<_, Infallible>(service_fn(router)) });

    let addr = SocketAddrV4::new(Ipv4Addr::LOCALHOST, 4000).into();
    let server = Server::bind(&addr).serve(service);

    server.await.expect("Failed to handle errors");
}