use serde::Serialize;
use crate::{ApiErrorKind, Client, Error, Plan, Result};
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum AccessOutcome {
Allowed,
Restricted {
status: u16,
body: String,
},
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct AccessReport {
pub configured_plan: Option<Plan>,
pub endpoint: String,
pub outcome: AccessOutcome,
}
impl Client {
pub async fn probe_access<Q>(&self, path: &str, params: &Q) -> Result<AccessReport>
where
Q: Serialize + ?Sized,
{
let outcome = match self.get_bytes(path, params).await {
Ok(_) => AccessOutcome::Allowed,
Err(Error::Api {
kind: ApiErrorKind::PlanRestricted,
status,
body,
..
}) => AccessOutcome::Restricted { status, body },
Err(error) => return Err(error),
};
Ok(AccessReport {
configured_plan: self.subscription().plan(),
endpoint: path.to_owned(),
outcome,
})
}
}