use crate::{config::listen::Protocol, error::Error, networks::terra, prelude::*};
use serde::Deserialize;
use std::convert::Infallible;
use tendermint::chain;
use tendermint_rpc::endpoint::{broadcast::tx_commit, status::SyncInfo};
use warp::Filter;
#[derive(Clone)]
pub struct Router {
addr: ([u8; 4], u16),
protocol: Protocol,
terra_oracle: terra::ExchangeRateOracle,
}
impl Router {
pub fn init() -> Result<Router, Error> {
let config = APP.config();
let addr = (config.listen.addr.octets(), config.listen.port);
let protocol = config.listen.protocol;
let terra_oracle = terra::ExchangeRateOracle::new(&config)?;
Ok(Self {
addr,
protocol,
terra_oracle,
})
}
pub async fn route(self) {
let addr = self.addr;
let protocol = self.protocol;
let terra_oracle_filter = warp::any().map(move || self.terra_oracle.clone());
let app = warp::post()
.and(warp::path("oracle"))
.and(warp::path::end())
.and(terra_oracle_filter.clone())
.and(warp::body::json())
.and_then(oracle_request);
match protocol {
Protocol::Http => warp::serve(app).run(addr).await,
}
}
}
pub async fn oracle_request(
oracle: terra::ExchangeRateOracle,
req: Request,
) -> Result<impl warp::Reply, Infallible> {
oracle.handle_request(req).await
}
#[derive(Clone, Debug, Deserialize)]
pub struct Request {
pub network: chain::Id,
#[serde(default)]
pub context: String,
pub status: Option<SyncInfo>,
pub last_tx_response: Option<tx_commit::Response>,
}