diff --git a/src/web/handlers/version.rs b/src/web/handlers/version.rs
index 92da95c..af1cd65 100644
@@ -1,18 +1,29 @@
-use axum::Json;
+use axum::{http::StatusCode, Json};
use crate::fleet::git::GitOps;
-pub async fn get_version() -> Json<serde_json::Value> {
- let workspace_root = std::env::current_dir()
- .ok()
- .and_then(|cwd| GitOps::discover_repo_root(&cwd).ok())
- .map(|path| path.display().to_string());
+pub async fn get_version() -> Result<Json<serde_json::Value>, (StatusCode, Json<serde_json::Value>)> {
+ let cwd = std::env::current_dir().map_err(|error| internal_error(error.into()))?;
+ let workspace_root = GitOps::discover_repo_root(&cwd).map_err(|error| internal_error(error.into()))?;
+ let workspace_version = crate::state::calculate_workspace_version_async(&workspace_root)
+ .await
+ .map_err(internal_error)?;
- Json(serde_json::json!({
+ Ok(Json(serde_json::json!({
"version": crate::get_version(),
"commit": "",
"build_date": "",
"read_only": false,
- "workspace_root": workspace_root
- }))
+ "workspace_root": workspace_root.display().to_string(),
+ "workspace_version": workspace_version.full_version
+ })))
+}
+
+fn internal_error(error: anyhow::Error) -> (StatusCode, Json<serde_json::Value>) {
+ (
+ StatusCode::INTERNAL_SERVER_ERROR,
+ Json(serde_json::json!({
+ "error": error.to_string()
+ })),
+ )
}