|
1 | 1 | use serde::de::DeserializeOwned; |
2 | | -use serde_json::{Map, Value}; |
| 2 | +use serde_json::{Map, Value, json}; |
3 | 3 | use std::env; |
4 | 4 | use std::path::Path; |
5 | 5 |
|
@@ -1004,85 +1004,48 @@ impl HttpClient { |
1004 | 1004 | verbose: bool, |
1005 | 1005 | source_metadata: Option<Value>, |
1006 | 1006 | target_uri: Option<&str>, |
| 1007 | + skills: &[String], |
| 1008 | + list_only: bool, |
1007 | 1009 | ) -> Result<serde_json::Value> { |
1008 | | - let path_obj = Path::new(data); |
1009 | | - |
1010 | | - if path_obj.exists() { |
1011 | | - if path_obj.is_dir() { |
1012 | | - let zip_file = if show_progress { |
1013 | | - self.zip_directory_with_progress(path_obj, verbose, None)? |
1014 | | - } else { |
1015 | | - self.zip_directory(path_obj, None)? |
1016 | | - }; |
1017 | | - let temp_file_id = if show_progress { |
1018 | | - self.upload_temp_file_with_progress(zip_file.path(), verbose) |
1019 | | - .await? |
1020 | | - } else { |
1021 | | - self.upload_temp_file(zip_file.path()).await? |
1022 | | - }; |
1023 | | - |
1024 | | - let mut body = serde_json::json!({ |
1025 | | - "temp_file_id": temp_file_id, |
1026 | | - "wait": wait, |
1027 | | - }); |
1028 | | - if let Some(source_metadata) = source_metadata.clone() { |
1029 | | - body["source_metadata"] = source_metadata; |
1030 | | - } |
1031 | | - if let Some(target_uri) = target_uri { |
1032 | | - body["target_uri"] = serde_json::Value::String(target_uri.to_string()); |
1033 | | - } |
1034 | | - let dynamic_timeout = |
1035 | | - TimeoutConfig::for_resource_processing().calculate(zip_file.path())?; |
1036 | | - self.base |
1037 | | - .post_with_timeout("/api/v1/skills", &body, dynamic_timeout) |
1038 | | - .await |
1039 | | - } else if path_obj.is_file() { |
1040 | | - let temp_file_id = if show_progress { |
1041 | | - self.upload_temp_file_with_progress(path_obj, verbose) |
1042 | | - .await? |
| 1010 | + let path = Path::new(data); |
| 1011 | + let mut body = json!({"wait": wait}); |
| 1012 | + if !skills.is_empty() { |
| 1013 | + body["skills"] = json!(skills); |
| 1014 | + } |
| 1015 | + if list_only { |
| 1016 | + body["list_only"] = json!(true); |
| 1017 | + } |
| 1018 | + if let Some(target_uri) = target_uri { |
| 1019 | + body["target_uri"] = json!(target_uri); |
| 1020 | + } |
| 1021 | + if let Some(metadata) = source_metadata { |
| 1022 | + body["source_metadata"] = metadata; |
| 1023 | + } else if path.exists() { |
| 1024 | + body["source_metadata"] = json!({"type": "local", "source": data, "path": data}); |
| 1025 | + } |
| 1026 | + if path.is_dir() || path.is_file() { |
| 1027 | + let archive = if path.is_dir() { |
| 1028 | + Some(if show_progress { |
| 1029 | + self.zip_directory_with_progress(path, verbose, None)? |
1043 | 1030 | } else { |
1044 | | - self.upload_temp_file(path_obj).await? |
1045 | | - }; |
1046 | | - |
1047 | | - let mut body = serde_json::json!({ |
1048 | | - "temp_file_id": temp_file_id, |
1049 | | - "wait": wait, |
1050 | | - }); |
1051 | | - if let Some(source_metadata) = source_metadata.clone() { |
1052 | | - body["source_metadata"] = source_metadata; |
1053 | | - } |
1054 | | - if let Some(target_uri) = target_uri { |
1055 | | - body["target_uri"] = serde_json::Value::String(target_uri.to_string()); |
1056 | | - } |
1057 | | - let dynamic_timeout = |
1058 | | - TimeoutConfig::for_resource_processing().calculate(path_obj)?; |
1059 | | - self.base |
1060 | | - .post_with_timeout("/api/v1/skills", &body, dynamic_timeout) |
1061 | | - .await |
| 1031 | + self.zip_directory(path, None)? |
| 1032 | + }) |
1062 | 1033 | } else { |
1063 | | - let mut body = serde_json::json!({ |
1064 | | - "data": data, |
1065 | | - "wait": wait, |
1066 | | - }); |
1067 | | - if let Some(source_metadata) = source_metadata.clone() { |
1068 | | - body["source_metadata"] = source_metadata; |
1069 | | - } |
1070 | | - if let Some(target_uri) = target_uri { |
1071 | | - body["target_uri"] = serde_json::Value::String(target_uri.to_string()); |
1072 | | - } |
1073 | | - self.post("/api/v1/skills", &body).await |
1074 | | - } |
| 1034 | + None |
| 1035 | + }; |
| 1036 | + let upload = archive.as_ref().map(|file| file.path()).unwrap_or(path); |
| 1037 | + let id = if show_progress { |
| 1038 | + self.upload_temp_file_with_progress(upload, verbose).await? |
| 1039 | + } else { |
| 1040 | + self.upload_temp_file(upload).await? |
| 1041 | + }; |
| 1042 | + body["temp_file_id"] = json!(id); |
| 1043 | + let dynamic_timeout = TimeoutConfig::for_resource_processing().calculate(upload)?; |
| 1044 | + self.base |
| 1045 | + .post_with_timeout("/api/v1/skills", &body, dynamic_timeout) |
| 1046 | + .await |
1075 | 1047 | } else { |
1076 | | - let mut body = serde_json::json!({ |
1077 | | - "data": data, |
1078 | | - "wait": wait, |
1079 | | - }); |
1080 | | - if let Some(source_metadata) = source_metadata { |
1081 | | - body["source_metadata"] = source_metadata; |
1082 | | - } |
1083 | | - if let Some(target_uri) = target_uri { |
1084 | | - body["target_uri"] = serde_json::Value::String(target_uri.to_string()); |
1085 | | - } |
| 1048 | + body["data"] = json!(data); |
1086 | 1049 | self.post("/api/v1/skills", &body).await |
1087 | 1050 | } |
1088 | 1051 | } |
@@ -2315,8 +2278,7 @@ mod tests { |
2315 | 2278 | assert!(!request.contains("include_mod_time_iso=")); |
2316 | 2279 |
|
2317 | 2280 | let (default_url, default_request_rx) = spawn_request_capture_server().await; |
2318 | | - let default_client = |
2319 | | - HttpClient::new(default_url, None, None, None, None, 5.0, false, None); |
| 2281 | + let default_client = HttpClient::new(default_url, None, None, None, None, 5.0, false, None); |
2320 | 2282 | default_client |
2321 | 2283 | .ls( |
2322 | 2284 | "viking://resources", |
@@ -2507,8 +2469,7 @@ mod tests { |
2507 | 2469 | assert!(!request.contains("include_mod_time_iso=")); |
2508 | 2470 |
|
2509 | 2471 | let (default_url, default_request_rx) = spawn_request_capture_server().await; |
2510 | | - let default_client = |
2511 | | - HttpClient::new(default_url, None, None, None, None, 5.0, false, None); |
| 2472 | + let default_client = HttpClient::new(default_url, None, None, None, None, 5.0, false, None); |
2512 | 2473 | default_client |
2513 | 2474 | .tree( |
2514 | 2475 | "viking://resources", |
|
0 commit comments