use async_trait::async_trait;
use crate::Rocket;
use crate::direction::{Destination, Direction, DirectionKind};
use crate::directions::JsonDirection;
use crate::error::ArtfulError;
use crate::flow_ctrl::Next;
use crate::http::get_client;
use crate::plugin::Plugin;
#[derive(Clone, Copy, Debug, Default)]
pub struct ParserPlugin;
#[async_trait]
impl Plugin for ParserPlugin {
async fn assembly(&self, rocket: &mut Rocket, next: Next<'_>) -> crate::Result<()> {
if let DirectionKind::NoRequest = rocket.config.direction {
return next.call(rocket).await;
}
rocket.destination_origin = Some(
get_client()
.execute(rocket.radar.take().ok_or(ArtfulError::MissingRequest)?)
.await
.map_err(ArtfulError::RequestFailed)?,
);
let destination = match &rocket.config.direction {
DirectionKind::Json => JsonDirection.parse(rocket).await?,
DirectionKind::Response => rocket
.destination_origin
.take()
.map(Destination::Response)
.ok_or(ArtfulError::MissingResponse)?,
DirectionKind::Custom(direction) => direction.clone().parse(rocket).await?,
DirectionKind::NoRequest => Destination::None,
};
rocket.destination = Some(destination);
next.call(rocket).await
}
}