use http::{Request, Uri};
use thiserror::Error;
use crate::model::{Effect, Operation};
use crate::request::{Invocation, ValueError};
use crate::values::Values;
#[derive(Debug, Clone)]
pub enum Plan {
Send(Request<Vec<u8>>),
DryRun(Request<Vec<u8>>),
}
impl Plan {
#[must_use]
pub fn decide(effect: Effect, confirmed: bool, request: Request<Vec<u8>>) -> Self {
match (effect, confirmed) {
(Effect::Read, _) | (Effect::Write, true) => Self::Send(request),
(Effect::Write, false) => Self::DryRun(request),
}
}
pub fn build(
op: &Operation,
base: &Uri,
values: Values,
confirmed: bool,
) -> Result<Self, PlanError> {
let invocation = Invocation::new(op, values)?;
Ok(Self::decide(
op.effect(),
confirmed,
invocation.request(base)?,
))
}
#[must_use]
pub fn request(&self) -> &Request<Vec<u8>> {
match self {
Self::Send(request) | Self::DryRun(request) => request,
}
}
}
#[derive(Debug, Error)]
pub enum PlanError {
#[error(transparent)]
Value(#[from] ValueError),
#[error("cannot build the request: {0}")]
Request(#[from] http::Error),
}