From dc0f307d61482c60b68013d7bd452c7bbda48e04 Mon Sep 17 00:00:00 2001 From: Tamo Date: Mon, 10 Oct 2022 15:16:22 +0200 Subject: [PATCH] remove all warnings --- dump/src/reader/compat/mod.rs | 14 -- dump/src/reader/compat/v2_to_v3.rs | 9 +- dump/src/reader/compat/v3_to_v4.rs | 2 +- dump/src/reader/compat/v4_to_v5.rs | 2 +- dump/src/reader/compat/v5_to_v6.rs | 2 +- dump/src/reader/v2/mod.rs | 9 +- dump/src/reader/v3/errors.rs | 195 --------------------- dump/src/reader/v3/mod.rs | 4 +- dump/src/reader/v4/mod.rs | 12 +- dump/src/reader/v4/tasks.rs | 265 +---------------------------- dump/src/reader/v5/mod.rs | 6 +- dump/src/reader/v5/settings.rs | 18 +- dump/src/reader/v5/tasks.rs | 9 +- dump/tests/assets/v2.dump | Bin 0 -> 64927 bytes 14 files changed, 26 insertions(+), 521 deletions(-) create mode 100644 dump/tests/assets/v2.dump diff --git a/dump/src/reader/compat/mod.rs b/dump/src/reader/compat/mod.rs index 42767f12a..ab9857c45 100644 --- a/dump/src/reader/compat/mod.rs +++ b/dump/src/reader/compat/mod.rs @@ -148,17 +148,3 @@ impl From for CompatIndex { CompatIndex::Compat(value) } } - -/// Parses the v1 version of the Asc ranking rules `asc(price)`and returns the field name. -pub fn asc_ranking_rule(text: &str) -> Option<&str> { - text.split_once("asc(") - .and_then(|(_, tail)| tail.rsplit_once(')')) - .map(|(field, _)| field) -} - -/// Parses the v1 version of the Desc ranking rules `desc(price)`and returns the field name. -pub fn desc_ranking_rule(text: &str) -> Option<&str> { - text.split_once("desc(") - .and_then(|(_, tail)| tail.rsplit_once(')')) - .map(|(field, _)| field) -} diff --git a/dump/src/reader/compat/v2_to_v3.rs b/dump/src/reader/compat/v2_to_v3.rs index 9bcc17649..7579811d0 100644 --- a/dump/src/reader/compat/v2_to_v3.rs +++ b/dump/src/reader/compat/v2_to_v3.rs @@ -4,7 +4,7 @@ use std::str::FromStr; use time::OffsetDateTime; use uuid::Uuid; -use crate::reader::{v2, v3, DumpReader, IndexReader}; +use crate::reader::{v2, v3}; use crate::Result; use super::v3_to_v4::CompatV3ToV4; @@ -19,7 +19,8 @@ impl CompatV2ToV3 { } pub fn index_uuid(&self) -> Vec { - self.index_uuid() + self.from + .index_uuid() .into_iter() .map(|index| v3::meta::IndexUuid { uid: index.uid, @@ -54,7 +55,7 @@ impl CompatV2ToV3 { pub fn tasks( &mut self, ) -> Box)>> + '_> { - let indexes = self.from.index_uuid.clone(); + let _indexes = self.from.index_uuid.clone(); Box::new( self.from @@ -241,7 +242,7 @@ pub fn update_from_unchecked_update_meta(update: v2::updates::UpdateMeta) -> v3: match update { v2::updates::UpdateMeta::DocumentsAddition { method, - format, + format: _, primary_key, } => v3::updates::Update::DocumentAddition { primary_key, diff --git a/dump/src/reader/compat/v3_to_v4.rs b/dump/src/reader/compat/v3_to_v4.rs index 068f2f41d..98709a0fb 100644 --- a/dump/src/reader/compat/v3_to_v4.rs +++ b/dump/src/reader/compat/v3_to_v4.rs @@ -1,4 +1,4 @@ -use crate::reader::{v3, v4, DumpReader, IndexReader}; +use crate::reader::{v3, v4}; use crate::Result; use super::v2_to_v3::{CompatIndexV2ToV3, CompatV2ToV3}; diff --git a/dump/src/reader/compat/v4_to_v5.rs b/dump/src/reader/compat/v4_to_v5.rs index b6bae8880..59579a51d 100644 --- a/dump/src/reader/compat/v4_to_v5.rs +++ b/dump/src/reader/compat/v4_to_v5.rs @@ -1,4 +1,4 @@ -use crate::reader::{v4, v5, DumpReader, IndexReader}; +use crate::reader::{v4, v5}; use crate::Result; use super::v3_to_v4::{CompatIndexV3ToV4, CompatV3ToV4}; diff --git a/dump/src/reader/compat/v5_to_v6.rs b/dump/src/reader/compat/v5_to_v6.rs index c47ef788f..a0fc0aa50 100644 --- a/dump/src/reader/compat/v5_to_v6.rs +++ b/dump/src/reader/compat/v5_to_v6.rs @@ -1,4 +1,4 @@ -use crate::reader::{v5, v6, DumpReader, IndexReader}; +use crate::reader::{v5, v6}; use crate::Result; use super::v4_to_v5::{CompatIndexV4ToV5, CompatV4ToV5}; diff --git a/dump/src/reader/v2/mod.rs b/dump/src/reader/v2/mod.rs index a69ebd828..f9baee09e 100644 --- a/dump/src/reader/v2/mod.rs +++ b/dump/src/reader/v2/mod.rs @@ -41,7 +41,7 @@ use crate::{IndexMetadata, Result, Version}; use self::meta::{DumpMeta, IndexUuid}; -use super::{compat::v2_to_v3::CompatV2ToV3, IndexReader}; +use super::compat::v2_to_v3::CompatV2ToV3; pub type Document = serde_json::Map; pub type Settings = settings::Settings; @@ -51,15 +51,8 @@ pub type Unchecked = settings::Unchecked; pub type Task = updates::UpdateEntry; pub type UpdateFile = File; -// ===== Other types to clarify the code of the compat module -// everything related to the tasks -pub type Status = updates::UpdateStatus; -// pub type Kind = updates::Update; -pub type Details = updates::UpdateResult; - // everything related to the errors pub type ResponseError = errors::ResponseError; -// pub type Code = errors::Code; #[derive(Serialize, Deserialize, Debug)] #[serde(rename_all = "camelCase")] diff --git a/dump/src/reader/v3/errors.rs b/dump/src/reader/v3/errors.rs index 6d236c187..40c4d2c8d 100644 --- a/dump/src/reader/v3/errors.rs +++ b/dump/src/reader/v3/errors.rs @@ -1,51 +1,5 @@ -use std::fmt; - -use http::StatusCode; use serde::{Deserialize, Serialize}; -pub trait ErrorCode: std::error::Error { - fn error_code(&self) -> Code; - - /// returns the HTTP status code ascociated with the error - fn http_status(&self) -> StatusCode { - self.error_code().http() - } - - /// returns the doc url ascociated with the error - fn error_url(&self) -> String { - self.error_code().url() - } - - /// returns error name, used as error code - fn error_name(&self) -> String { - self.error_code().name() - } - - /// return the error type - fn error_type(&self) -> String { - self.error_code().type_() - } -} - -#[allow(clippy::enum_variant_names)] -enum ErrorType { - InternalError, - InvalidRequestError, - AuthenticationError, -} - -impl fmt::Display for ErrorType { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - use ErrorType::*; - - match self { - InternalError => write!(f, "internal"), - InvalidRequestError => write!(f, "invalid_request"), - AuthenticationError => write!(f, "auth"), - } - } -} - #[derive(Serialize, Deserialize, Debug, Clone, Copy)] pub enum Code { // index related error @@ -95,152 +49,3 @@ pub enum Code { MalformedDump, UnretrievableErrorCode, } - -impl Code { - /// ascociate a `Code` variant to the actual ErrCode - fn err_code(&self) -> ErrCode { - use Code::*; - - match self { - // index related errors - // create index is thrown on internal error while creating an index. - CreateIndex => { - ErrCode::internal("index_creation_failed", StatusCode::INTERNAL_SERVER_ERROR) - } - IndexAlreadyExists => ErrCode::invalid("index_already_exists", StatusCode::CONFLICT), - // thrown when requesting an unexisting index - IndexNotFound => ErrCode::invalid("index_not_found", StatusCode::NOT_FOUND), - InvalidIndexUid => ErrCode::invalid("invalid_index_uid", StatusCode::BAD_REQUEST), - - // invalid state error - InvalidState => ErrCode::internal("invalid_state", StatusCode::INTERNAL_SERVER_ERROR), - // thrown when no primary key has been set - MissingPrimaryKey => { - ErrCode::invalid("primary_key_inference_failed", StatusCode::BAD_REQUEST) - } - // error thrown when trying to set an already existing primary key - PrimaryKeyAlreadyPresent => { - ErrCode::invalid("index_primary_key_already_exists", StatusCode::BAD_REQUEST) - } - // invalid ranking rule - InvalidRankingRule => ErrCode::invalid("invalid_ranking_rule", StatusCode::BAD_REQUEST), - - // invalid database - InvalidStore => { - ErrCode::internal("invalid_store_file", StatusCode::INTERNAL_SERVER_ERROR) - } - - // invalid document - MaxFieldsLimitExceeded => { - ErrCode::invalid("max_fields_limit_exceeded", StatusCode::BAD_REQUEST) - } - MissingDocumentId => ErrCode::invalid("missing_document_id", StatusCode::BAD_REQUEST), - InvalidDocumentId => ErrCode::invalid("invalid_document_id", StatusCode::BAD_REQUEST), - - // error related to filters - Filter => ErrCode::invalid("invalid_filter", StatusCode::BAD_REQUEST), - // error related to sorts - Sort => ErrCode::invalid("invalid_sort", StatusCode::BAD_REQUEST), - - BadParameter => ErrCode::invalid("bad_parameter", StatusCode::BAD_REQUEST), - BadRequest => ErrCode::invalid("bad_request", StatusCode::BAD_REQUEST), - DatabaseSizeLimitReached => ErrCode::internal( - "database_size_limit_reached", - StatusCode::INTERNAL_SERVER_ERROR, - ), - DocumentNotFound => ErrCode::invalid("document_not_found", StatusCode::NOT_FOUND), - Internal => ErrCode::internal("internal", StatusCode::INTERNAL_SERVER_ERROR), - InvalidGeoField => ErrCode::invalid("invalid_geo_field", StatusCode::BAD_REQUEST), - InvalidToken => ErrCode::authentication("invalid_api_key", StatusCode::FORBIDDEN), - MissingAuthorizationHeader => { - ErrCode::authentication("missing_authorization_header", StatusCode::UNAUTHORIZED) - } - TaskNotFound => ErrCode::invalid("task_not_found", StatusCode::NOT_FOUND), - DumpNotFound => ErrCode::invalid("dump_not_found", StatusCode::NOT_FOUND), - NoSpaceLeftOnDevice => { - ErrCode::internal("no_space_left_on_device", StatusCode::INTERNAL_SERVER_ERROR) - } - PayloadTooLarge => ErrCode::invalid("payload_too_large", StatusCode::PAYLOAD_TOO_LARGE), - RetrieveDocument => { - ErrCode::internal("unretrievable_document", StatusCode::BAD_REQUEST) - } - SearchDocuments => ErrCode::internal("search_error", StatusCode::BAD_REQUEST), - UnsupportedMediaType => { - ErrCode::invalid("unsupported_media_type", StatusCode::UNSUPPORTED_MEDIA_TYPE) - } - - // error related to dump - DumpAlreadyInProgress => { - ErrCode::invalid("dump_already_processing", StatusCode::CONFLICT) - } - DumpProcessFailed => { - ErrCode::internal("dump_process_failed", StatusCode::INTERNAL_SERVER_ERROR) - } - MissingContentType => { - ErrCode::invalid("missing_content_type", StatusCode::UNSUPPORTED_MEDIA_TYPE) - } - MalformedPayload => ErrCode::invalid("malformed_payload", StatusCode::BAD_REQUEST), - InvalidContentType => { - ErrCode::invalid("invalid_content_type", StatusCode::UNSUPPORTED_MEDIA_TYPE) - } - MissingPayload => ErrCode::invalid("missing_payload", StatusCode::BAD_REQUEST), - UnretrievableErrorCode => { - ErrCode::invalid("unretrievable_error_code", StatusCode::BAD_REQUEST) - } - MalformedDump => ErrCode::invalid("malformed_dump", StatusCode::BAD_REQUEST), - } - } - - /// return the HTTP status code ascociated with the `Code` - fn http(&self) -> StatusCode { - self.err_code().status_code - } - - /// return error name, used as error code - fn name(&self) -> String { - self.err_code().error_name.to_string() - } - - /// return the error type - fn type_(&self) -> String { - self.err_code().error_type.to_string() - } - - /// return the doc url ascociated with the error - fn url(&self) -> String { - format!("https://docs.meilisearch.com/errors#{}", self.name()) - } -} - -/// Internal structure providing a convenient way to create error codes -struct ErrCode { - status_code: StatusCode, - error_type: ErrorType, - error_name: &'static str, -} - -impl ErrCode { - fn authentication(error_name: &'static str, status_code: StatusCode) -> ErrCode { - ErrCode { - status_code, - error_name, - error_type: ErrorType::AuthenticationError, - } - } - - fn internal(error_name: &'static str, status_code: StatusCode) -> ErrCode { - ErrCode { - status_code, - error_name, - error_type: ErrorType::InternalError, - } - } - - fn invalid(error_name: &'static str, status_code: StatusCode) -> ErrCode { - ErrCode { - status_code, - error_name, - error_type: ErrorType::InvalidRequestError, - } - } -} diff --git a/dump/src/reader/v3/mod.rs b/dump/src/reader/v3/mod.rs index 77cf8085b..642062a73 100644 --- a/dump/src/reader/v3/mod.rs +++ b/dump/src/reader/v3/mod.rs @@ -41,7 +41,7 @@ use crate::{IndexMetadata, Result, Version}; use self::meta::{DumpMeta, IndexUuid}; -use super::{compat::v3_to_v4::CompatV3ToV4, IndexReader}; +use super::compat::v3_to_v4::CompatV3ToV4; pub type Document = serde_json::Map; pub type Settings = settings::Settings; @@ -55,13 +55,11 @@ pub type UpdateFile = File; // everything related to the tasks pub type Status = updates::UpdateStatus; pub type Kind = updates::Update; -pub type Details = updates::UpdateResult; // everything related to the settings pub type Setting = settings::Setting; // everything related to the errors -// pub type ResponseError = errors::ResponseError; pub type Code = errors::Code; #[derive(Serialize, Deserialize, Debug)] diff --git a/dump/src/reader/v4/mod.rs b/dump/src/reader/v4/mod.rs index 1f2ab9649..d2d775ad5 100644 --- a/dump/src/reader/v4/mod.rs +++ b/dump/src/reader/v4/mod.rs @@ -19,7 +19,7 @@ use crate::{IndexMetadata, Result, Version}; use self::meta::{DumpMeta, IndexUuid}; -use super::{compat::v4_to_v5::CompatV4ToV5, DumpReader, IndexReader}; +use super::compat::v4_to_v5::CompatV4ToV5; pub type Document = serde_json::Map; pub type Settings = settings::Settings; @@ -30,21 +30,11 @@ pub type Task = tasks::Task; pub type UpdateFile = File; pub type Key = keys::Key; -// ===== Other types to clarify the code of the compat module -// everything related to the tasks -pub type Status = tasks::TaskStatus; -pub type Kind = tasks::TaskType; -pub type Details = tasks::TaskDetails; - // everything related to the settings pub type Setting = settings::Setting; -pub type TypoTolerance = settings::TypoSettings; -pub type MinWordSizeForTypos = settings::MinWordSizeTyposSetting; // everything related to the api keys pub type Action = keys::Action; -pub type StarOr = meta::StarOr; -pub type IndexUid = meta::IndexUid; // everything related to the errors pub type ResponseError = errors::ResponseError; diff --git a/dump/src/reader/v4/tasks.rs b/dump/src/reader/v4/tasks.rs index dbe4d225e..dfe5452d8 100644 --- a/dump/src/reader/v4/tasks.rs +++ b/dump/src/reader/v4/tasks.rs @@ -1,7 +1,5 @@ -use std::fmt::Write; - -use serde::{Deserialize, Serializer}; -use time::{Duration, OffsetDateTime}; +use serde::Deserialize; +use time::OffsetDateTime; use uuid::Uuid; use super::{ @@ -49,56 +47,6 @@ pub enum TaskContent { }, } -#[derive(Debug)] -#[cfg_attr(test, derive(serde::Serialize))] -#[cfg_attr(test, serde(untagged))] -#[allow(clippy::large_enum_variant)] -pub enum TaskDetails { - #[cfg_attr(test, serde(rename_all = "camelCase"))] - DocumentAddition { - received_documents: usize, - indexed_documents: Option, - }, - #[cfg_attr(test, serde(rename_all = "camelCase"))] - Settings { - #[cfg_attr(test, serde(flatten))] - settings: Settings, - }, - #[cfg_attr(test, serde(rename_all = "camelCase"))] - IndexInfo { primary_key: Option }, - #[cfg_attr(test, serde(rename_all = "camelCase"))] - DocumentDeletion { - received_document_ids: usize, - deleted_documents: Option, - }, - #[cfg_attr(test, serde(rename_all = "camelCase"))] - ClearAll { deleted_documents: Option }, -} - -#[derive(Debug)] -#[cfg_attr(test, derive(serde::Serialize))] -#[cfg_attr(test, serde(rename_all = "camelCase"))] -pub enum TaskStatus { - Enqueued, - Processing, - Succeeded, - Failed, -} - -#[derive(Debug)] -#[cfg_attr(test, derive(serde::Serialize))] -#[cfg_attr(test, serde(rename_all = "camelCase"))] -pub enum TaskType { - IndexCreation, - IndexUpdate, - IndexDeletion, - DocumentAddition, - DocumentPartial, - DocumentDeletion, - SettingsUpdate, - ClearAll, -} - #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize)] #[cfg_attr(test, derive(serde::Serialize))] pub enum IndexDocumentsMethod { @@ -189,214 +137,17 @@ impl std::ops::Deref for IndexUid { } } -#[derive(Debug)] -#[cfg_attr(test, derive(serde::Serialize))] -#[cfg_attr(test, serde(rename_all = "camelCase"))] -pub struct TaskView { - uid: TaskId, - index_uid: String, - status: TaskStatus, - #[cfg_attr(test, serde(rename = "type"))] - task_type: TaskType, - #[cfg_attr(test, serde(skip_serializing_if = "Option::is_none"))] - details: Option, - #[cfg_attr(test, serde(skip_serializing_if = "Option::is_none"))] - error: Option, - #[cfg_attr(test, serde(serialize_with = "serialize_duration"))] - duration: Option, - #[cfg_attr(test, serde(serialize_with = "time::serde::rfc3339::serialize"))] - enqueued_at: OffsetDateTime, - #[cfg_attr( - test, - serde(serialize_with = "time::serde::rfc3339::option::serialize") - )] - started_at: Option, - #[cfg_attr( - test, - serde(serialize_with = "time::serde::rfc3339::option::serialize") - )] - finished_at: Option, - #[cfg_attr(test, serde(skip_serializing_if = "Option::is_none"))] - batch_uid: Option>, -} - -impl From for TaskView { - fn from(task: Task) -> Self { - let Task { - id, - index_uid, - content, - events, - } = task; - - let (task_type, mut details) = match content { - TaskContent::DocumentAddition { - merge_strategy, - documents_count, - .. - } => { - let details = TaskDetails::DocumentAddition { - received_documents: documents_count, - indexed_documents: None, - }; - - let task_type = match merge_strategy { - IndexDocumentsMethod::UpdateDocuments => TaskType::DocumentPartial, - IndexDocumentsMethod::ReplaceDocuments => TaskType::DocumentAddition, - _ => unreachable!("Unexpected document merge strategy."), - }; - - (task_type, Some(details)) - } - TaskContent::DocumentDeletion(DocumentDeletion::Ids(ids)) => ( - TaskType::DocumentDeletion, - Some(TaskDetails::DocumentDeletion { - received_document_ids: ids.len(), - deleted_documents: None, - }), - ), - TaskContent::DocumentDeletion(DocumentDeletion::Clear) => ( - TaskType::ClearAll, - Some(TaskDetails::ClearAll { - deleted_documents: None, - }), - ), - TaskContent::IndexDeletion => ( - TaskType::IndexDeletion, - Some(TaskDetails::ClearAll { - deleted_documents: None, - }), - ), - TaskContent::SettingsUpdate { settings, .. } => ( - TaskType::SettingsUpdate, - Some(TaskDetails::Settings { settings }), - ), - TaskContent::IndexCreation { primary_key } => ( - TaskType::IndexCreation, - Some(TaskDetails::IndexInfo { primary_key }), - ), - TaskContent::IndexUpdate { primary_key } => ( - TaskType::IndexUpdate, - Some(TaskDetails::IndexInfo { primary_key }), - ), - }; - - // An event always has at least one event: "Created" - let (status, error, finished_at) = match events.last().unwrap() { - TaskEvent::Created(_) => (TaskStatus::Enqueued, None, None), - TaskEvent::Batched { .. } => (TaskStatus::Enqueued, None, None), - TaskEvent::Processing(_) => (TaskStatus::Processing, None, None), - TaskEvent::Succeded { timestamp, result } => { - match (result, &mut details) { - ( - TaskResult::DocumentAddition { - indexed_documents: num, - .. - }, - Some(TaskDetails::DocumentAddition { - ref mut indexed_documents, - .. - }), - ) => { - indexed_documents.replace(*num); - } - ( - TaskResult::DocumentDeletion { - deleted_documents: docs, - .. - }, - Some(TaskDetails::DocumentDeletion { - ref mut deleted_documents, - .. - }), - ) => { - deleted_documents.replace(*docs); - } - ( - TaskResult::ClearAll { - deleted_documents: docs, - }, - Some(TaskDetails::ClearAll { - ref mut deleted_documents, - }), - ) => { - deleted_documents.replace(*docs); - } - _ => (), - } - (TaskStatus::Succeeded, None, Some(*timestamp)) - } - TaskEvent::Failed { timestamp, error } => { - match details { - Some(TaskDetails::DocumentDeletion { - ref mut deleted_documents, - .. - }) => { - deleted_documents.replace(0); - } - Some(TaskDetails::ClearAll { - ref mut deleted_documents, - .. - }) => { - deleted_documents.replace(0); - } - Some(TaskDetails::DocumentAddition { - ref mut indexed_documents, - .. - }) => { - indexed_documents.replace(0); - } - _ => (), - } - (TaskStatus::Failed, Some(error.clone()), Some(*timestamp)) - } - }; - - let enqueued_at = match events.first() { - Some(TaskEvent::Created(ts)) => *ts, - _ => unreachable!("A task must always have a creation event."), - }; - - let started_at = events.iter().find_map(|e| match e { - TaskEvent::Processing(ts) => Some(*ts), - _ => None, - }); - - let duration = finished_at.zip(started_at).map(|(tf, ts)| (tf - ts)); - - let batch_uid = if true { - let id = events.iter().find_map(|e| match e { - TaskEvent::Batched { batch_id, .. } => Some(*batch_id), - _ => None, - }); - Some(id) - } else { - None - }; - - Self { - uid: id, - index_uid: index_uid.into_inner(), - status, - task_type, - details, - error, - duration, - enqueued_at, - started_at, - finished_at, - batch_uid, - } - } -} - /// Serialize a `time::Duration` as a best effort ISO 8601 while waiting for /// https://github.com/time-rs/time/issues/378. /// This code is a port of the old code of time that was removed in 0.2. -fn serialize_duration( - duration: &Option, +#[cfg(test)] +fn serialize_duration( + duration: &Option, serializer: S, ) -> Result { + use std::fmt::Write; + use time::Duration; + match duration { Some(duration) => { // technically speaking, negative duration is not valid ISO 8601 diff --git a/dump/src/reader/v5/mod.rs b/dump/src/reader/v5/mod.rs index b95736070..27a36f66f 100644 --- a/dump/src/reader/v5/mod.rs +++ b/dump/src/reader/v5/mod.rs @@ -45,7 +45,7 @@ use uuid::Uuid; use crate::{IndexMetadata, Result, Version}; -use super::{compat::v5_to_v6::CompatV5ToV6, DumpReader, IndexReader}; +use super::compat::v5_to_v6::CompatV5ToV6; pub mod errors; pub mod keys; @@ -65,20 +65,16 @@ pub type Key = keys::Key; // ===== Other types to clarify the code of the compat module // everything related to the tasks pub type Status = tasks::TaskStatus; -pub type Kind = tasks::TaskType; pub type Details = tasks::TaskDetails; // everything related to the settings pub type Setting = settings::Setting; pub type TypoTolerance = settings::TypoSettings; pub type MinWordSizeForTypos = settings::MinWordSizeTyposSetting; -pub type FacetingSettings = settings::FacetingSettings; -pub type PaginationSettings = settings::PaginationSettings; // everything related to the api keys pub type Action = keys::Action; pub type StarOr = meta::StarOr; -pub type IndexUid = meta::IndexUid; // everything related to the errors pub type ResponseError = errors::ResponseError; diff --git a/dump/src/reader/v5/settings.rs b/dump/src/reader/v5/settings.rs index 68fae2b26..05d100cd0 100644 --- a/dump/src/reader/v5/settings.rs +++ b/dump/src/reader/v5/settings.rs @@ -3,7 +3,7 @@ use std::{ marker::PhantomData, }; -use serde::{Deserialize, Deserializer, Serialize, Serializer}; +use serde::{Deserialize, Deserializer, Serialize}; #[derive(Clone, Default, Debug, Serialize, PartialEq, Eq)] pub struct Checked; @@ -49,22 +49,6 @@ pub struct Settings { pub _kind: PhantomData, } -fn serialize_with_wildcard( - field: &Setting>, - s: S, -) -> std::result::Result -where - S: Serializer, -{ - let wildcard = vec!["*".to_string()]; - match field { - Setting::Set(value) => Some(value), - Setting::Reset => Some(&wildcard), - Setting::NotSet => None, - } - .serialize(s) -} - #[derive(Debug, Clone, PartialEq, Copy)] #[cfg_attr(test, derive(serde::Serialize))] pub enum Setting { diff --git a/dump/src/reader/v5/tasks.rs b/dump/src/reader/v5/tasks.rs index 835fbab5e..73b4048af 100644 --- a/dump/src/reader/v5/tasks.rs +++ b/dump/src/reader/v5/tasks.rs @@ -1,6 +1,4 @@ -use std::fmt::Write; - -use serde::{Deserialize, Serializer}; +use serde::Deserialize; use time::{Duration, OffsetDateTime}; use uuid::Uuid; @@ -427,10 +425,13 @@ pub enum TaskDetails { /// Serialize a `time::Duration` as a best effort ISO 8601 while waiting for /// https://github.com/time-rs/time/issues/378. /// This code is a port of the old code of time that was removed in 0.2. -fn serialize_duration( +#[cfg(test)] +fn serialize_duration( duration: &Option, serializer: S, ) -> Result { + use std::fmt::Write; + match duration { Some(duration) => { // technically speaking, negative duration is not valid ISO 8601 diff --git a/dump/tests/assets/v2.dump b/dump/tests/assets/v2.dump new file mode 100644 index 0000000000000000000000000000000000000000..eacea80a5446189c898341de34c63302b759d779 GIT binary patch literal 64927 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 *A8*78`h0uZ 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 z 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