diff --git a/meilisearch-http/tests/documents/add_documents.rs b/meilisearch-http/tests/documents/add_documents.rs index 685428784..8e6ba44a9 100644 --- a/meilisearch-http/tests/documents/add_documents.rs +++ b/meilisearch-http/tests/documents/add_documents.rs @@ -372,7 +372,7 @@ async fn error_add_malformed_json_documents() { assert_eq!( response["message"], json!( - r#"The `json` payload provided is malformed. `Couldn't serialize document value: data did not match any variant of untagged enum Either`."# + r#"The `json` payload provided is malformed. `Couldn't serialize document value: data are neither an object nor a list of objects`."# ) ); assert_eq!(response["code"], json!("malformed_payload")); @@ -395,7 +395,7 @@ async fn error_add_malformed_json_documents() { assert_eq!(status_code, 400); assert_eq!( response["message"], - json!("The `json` payload provided is malformed. `Couldn't serialize document value: data did not match any variant of untagged enum Either`.") + json!("The `json` payload provided is malformed. `Couldn't serialize document value: data are neither an object nor a list of objects`.") ); assert_eq!(response["code"], json!("malformed_payload")); assert_eq!(response["type"], json!("invalid_request")); diff --git a/meilisearch-lib/src/document_formats.rs b/meilisearch-lib/src/document_formats.rs index 83e5b9fdb..cfc200019 100644 --- a/meilisearch-lib/src/document_formats.rs +++ b/meilisearch-lib/src/document_formats.rs @@ -8,6 +8,7 @@ use meilisearch_types::internal_error; use milli::documents::{DocumentsBatchBuilder, Error}; use milli::Object; use serde::Deserialize; +use serde_json::error::Category; type Result = std::result::Result; @@ -40,18 +41,24 @@ impl Display for DocumentFormatError { Self::Internal(e) => write!(f, "An internal error has occurred: `{}`.", e), Self::MalformedPayload(me, b) => match me.borrow() { Error::Json(se) => { + let mut message = match se.classify() { + Category::Data => { + "data are neither an object nor a list of objects".to_string() + } + _ => se.to_string(), + }; + // https://github.com/meilisearch/meilisearch/issues/2107 // The user input maybe insanely long. We need to truncate it. - let mut serde_msg = se.to_string(); let ellipsis = "..."; let trim_input_prefix_len = 50; let trim_input_suffix_len = 85; - if serde_msg.len() + if message.len() > trim_input_prefix_len + trim_input_suffix_len + ellipsis.len() { - serde_msg.replace_range( - trim_input_prefix_len..serde_msg.len() - trim_input_suffix_len, + message.replace_range( + trim_input_prefix_len..message.len() - trim_input_suffix_len, ellipsis, ); } @@ -59,7 +66,7 @@ impl Display for DocumentFormatError { write!( f, "The `{}` payload provided is malformed. `Couldn't serialize document value: {}`.", - b, serde_msg + b, message ) } _ => write!(f, "The `{}` payload provided is malformed: `{}`.", b, me),