补充 Raw 图片参数预检查
在计费前校验质量、背景和输出格式 规范化可选参数并保持单图请求契约
This commit is contained in:
@@ -119,6 +119,24 @@ fn prepare_request(payload: RawImageEditRequest) -> Result<PreparedRawImageEdit,
|
|||||||
if payload.width == 0 || payload.height == 0 {
|
if payload.width == 0 || payload.height == 0 {
|
||||||
return Err(bad_request("width 和 height 必须为正整数"));
|
return Err(bad_request("width 和 height 必须为正整数"));
|
||||||
}
|
}
|
||||||
|
validate_optional_value(
|
||||||
|
payload.quality.as_deref(),
|
||||||
|
"quality",
|
||||||
|
["low", "medium", "high", "auto"],
|
||||||
|
)?;
|
||||||
|
validate_optional_value(
|
||||||
|
payload.background.as_deref(),
|
||||||
|
"background",
|
||||||
|
["transparent", "opaque", "auto"],
|
||||||
|
)?;
|
||||||
|
validate_optional_value(
|
||||||
|
payload.output_format.as_deref(),
|
||||||
|
"output_format",
|
||||||
|
["png", "webp", "jpeg"],
|
||||||
|
)?;
|
||||||
|
let quality = normalize_optional(payload.quality);
|
||||||
|
let background = normalize_optional(payload.background);
|
||||||
|
let output_format = normalize_optional(payload.output_format);
|
||||||
let image = decode_image(payload.image, "image")?;
|
let image = decode_image(payload.image, "image")?;
|
||||||
let mask = payload
|
let mask = payload
|
||||||
.mask
|
.mask
|
||||||
@@ -128,9 +146,9 @@ fn prepare_request(payload: RawImageEditRequest) -> Result<PreparedRawImageEdit,
|
|||||||
image,
|
image,
|
||||||
prompt: payload.prompt,
|
prompt: payload.prompt,
|
||||||
options: RawImageEditOptions {
|
options: RawImageEditOptions {
|
||||||
quality: payload.quality,
|
quality,
|
||||||
background: payload.background,
|
background,
|
||||||
output_format: payload.output_format,
|
output_format,
|
||||||
width: payload.width,
|
width: payload.width,
|
||||||
height: payload.height,
|
height: payload.height,
|
||||||
mask,
|
mask,
|
||||||
@@ -140,6 +158,26 @@ fn prepare_request(payload: RawImageEditRequest) -> Result<PreparedRawImageEdit,
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn normalize_optional(value: Option<String>) -> Option<String> {
|
||||||
|
value
|
||||||
|
.map(|value| value.trim().to_string())
|
||||||
|
.filter(|value| !value.is_empty())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn validate_optional_value<const N: usize>(
|
||||||
|
value: Option<&str>,
|
||||||
|
field: &str,
|
||||||
|
allowed: [&str; N],
|
||||||
|
) -> Result<(), AppError> {
|
||||||
|
let Some(value) = value.map(str::trim).filter(|value| !value.is_empty()) else {
|
||||||
|
return Ok(());
|
||||||
|
};
|
||||||
|
if allowed.contains(&value) {
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
Err(bad_request(format!("{field} 值无效")))
|
||||||
|
}
|
||||||
|
|
||||||
fn decode_image(value: RawImageData, field: &str) -> Result<ReferenceImage, AppError> {
|
fn decode_image(value: RawImageData, field: &str) -> Result<ReferenceImage, AppError> {
|
||||||
let mime_type = value.mime_type.trim().to_string();
|
let mime_type = value.mime_type.trim().to_string();
|
||||||
if mime_type.is_empty() {
|
if mime_type.is_empty() {
|
||||||
|
|||||||
Reference in New Issue
Block a user