From 9b2036ac055ee80f6db775db3869046ff36ffcff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Renault?= Date: Thu, 18 Aug 2022 11:55:14 +0200 Subject: [PATCH] Accept either an array of documents or a single document --- Cargo.lock | 3 +++ meilisearch-lib/Cargo.toml | 2 +- meilisearch-lib/src/document_formats.rs | 14 ++++++++++++-- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 627c9c0b2..2eddd276e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -983,6 +983,9 @@ name = "either" version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +dependencies = [ + "serde", +] [[package]] name = "embedded-hal" diff --git a/meilisearch-lib/Cargo.toml b/meilisearch-lib/Cargo.toml index d3790a91c..d0ca59289 100644 --- a/meilisearch-lib/Cargo.toml +++ b/meilisearch-lib/Cargo.toml @@ -15,7 +15,7 @@ clap = { version = "3.1.6", features = ["derive", "env"] } crossbeam-channel = "0.5.2" csv = "1.1.6" derivative = "2.2.0" -either = "1.6.1" +either = { version = "1.6.1", features = ["serde"] } flate2 = "1.0.22" fs_extra = "1.2.0" fst = "0.4.7" diff --git a/meilisearch-lib/src/document_formats.rs b/meilisearch-lib/src/document_formats.rs index 72e899845..ebc98f3fb 100644 --- a/meilisearch-lib/src/document_formats.rs +++ b/meilisearch-lib/src/document_formats.rs @@ -2,9 +2,12 @@ use std::borrow::Borrow; use std::fmt::{self, Debug, Display}; use std::io::{self, BufReader, Read, Seek, Write}; +use either::Either; use meilisearch_types::error::{Code, ErrorCode}; use meilisearch_types::internal_error; use milli::documents::{DocumentsBatchBuilder, Error}; +use milli::Object; +use serde::Deserialize; type Result = std::result::Result; @@ -124,11 +127,18 @@ pub fn read_json(input: impl Read, writer: impl Write + Seek) -> Result { let mut builder = DocumentsBatchBuilder::new(writer); let reader = BufReader::new(input); - let objects: Vec<_> = serde_json::from_reader(reader) + #[derive(Deserialize, Debug)] + #[serde(transparent)] + struct ArrayOrSingleObject { + #[serde(with = "either::serde_untagged")] + inner: Either, Object>, + } + + let content: ArrayOrSingleObject = serde_json::from_reader(reader) .map_err(Error::Json) .map_err(|e| (PayloadType::Json, e))?; - for object in objects { + for object in content.inner.map_right(|o| vec![o]).into_inner() { builder .append_json_object(&object) .map_err(Into::into)