use crate::error::{ApplyError, ConfigError};
use crate::view::EditValue;
pub(super) fn build_rule_from_payload(
payload: crate::view::RulePayload,
rule_set: &apimock_routing::RuleSet,
rs_idx: usize,
existing: Option<&apimock_routing::Rule>,
) -> Result<apimock_routing::Rule, ApplyError> {
use apimock_routing::rule_set::rule::Rule;
use apimock_routing::rule_set::rule::when::When;
use apimock_routing::rule_set::rule::when::request::{
Request, http_method::HttpMethod, url_path::UrlPathConfig,
};
let url_path_config = payload.url_path.as_ref().map(|s| UrlPathConfig::Simple(s.clone()));
let http_method = match payload.method.as_deref() {
Some("GET") | Some("get") => Some(HttpMethod::Get),
Some("POST") | Some("post") => Some(HttpMethod::Post),
Some("PUT") | Some("put") => Some(HttpMethod::Put),
Some("DELETE") | Some("delete") => Some(HttpMethod::Delete),
Some(other) => {
return Err(ApplyError::InvalidPayload {
reason: format!(
"unsupported HTTP method `{}` — supported: GET, POST, PUT, DELETE",
other
),
});
}
None => None,
};
let (headers, body) = match existing {
Some(prev) => (prev.when.request.headers.clone(), prev.when.request.body.clone()),
None => (None, None),
};
let request = Request {
url_path_config,
url_path: None, http_method,
headers,
body,
};
let rule = Rule {
when: When { request },
respond: build_respond_from_payload(payload.respond),
};
Ok(rule.compute_derived_fields(rule_set, rule_set.rules.len(), rs_idx))
}
pub(super) fn build_respond_from_payload(payload: crate::view::RespondPayload) -> apimock_routing::Respond {
apimock_routing::Respond {
file_path: payload.file_path,
csv_records_key: None,
text: payload.text,
status: payload.status,
status_code: None, headers: None,
delay_response_milliseconds: payload.delay_milliseconds,
}
}
pub(super) fn value_as_string(value: &EditValue) -> Result<String, ApplyError> {
match value {
EditValue::String(s) => Ok(s.clone()),
EditValue::Enum(s) => Ok(s.clone()),
other => Err(ApplyError::InvalidPayload {
reason: format!("expected a string, got {:?}", other),
}),
}
}
pub(super) fn value_as_integer(value: &EditValue) -> Result<i64, ApplyError> {
match value {
EditValue::Integer(n) => Ok(*n),
other => Err(ApplyError::InvalidPayload {
reason: format!("expected an integer, got {:?}", other),
}),
}
}
pub(super) fn internal_path_err(err: ConfigError) -> ApplyError {
ApplyError::InvalidPayload {
reason: format!("internal path resolution failed: {}", err),
}
}