use axum::Json;
use axum::extract::State;
use serde::{Deserialize, Serialize};
use crate::auth::CurrentUser;
use crate::error::Error;
use crate::state::AppState;
#[derive(Debug, Deserialize)]
pub struct MeasureRequest {
pub font_id: String,
pub font_px: f32,
pub lines: Vec<String>,
}
#[derive(Debug, Serialize)]
pub struct MeasureResponse {
pub width: u32,
pub height: u32,
}
pub async fn measure(
_user: CurrentUser,
State(state): State<AppState>,
Json(req): Json<MeasureRequest>,
) -> Result<Json<MeasureResponse>, Error> {
if !(req.font_px.is_finite() && req.font_px > 0f32) {
return Err(Error::BadRequest(format!(
"font size must be a positive number of pixels, got {}",
req.font_px
)));
}
let font_path = state
.fonts
.path_for(&req.font_id)
.ok_or_else(|| Error::BadRequest(format!("unknown font_id `{}`", req.font_id)))?;
let font = sl_map_apis::text::load_font(font_path)?;
let scale = ab_glyph::PxScale::from(req.font_px);
let (width, height) = sl_map_apis::text::measure_text(scale, &font, &req.lines);
Ok(Json(MeasureResponse { width, height }))
}