Skip to content

0.20.0

Compare
Choose a tag to compare
@KodrAus KodrAus released this 05 Oct 08:58
· 149 commits to master since this release

A note on this release

There have been a lot of changes across many repositories. This makes it difficult to provide a comprehensive list of breaking changes (there are a number of them, but upgrading should be fairly mechanical). For future releases we'll start maintaining a CHANGELOG to collect changes as they occur.

The following is a general list of significant changes.

Async

This release adds async support to elastic using the tokio and futures ecosystem.

The implementation uses generics to parameterise request builders. This means we share a lot of code between the sync and async APIs, but can make the docs noisier and harder to follow.

Combining repositories

Each of the crates in the elastic organisation have been pulled in to this single repository. This will make it easier to track changes in the future, as well as share CI infrastructure. Overall it should lead to a more solid and contributor-friendly project.

elastic now contains the following crates with synchronized versions:

  • elastic_requests
  • elastic_responses
  • elastic_types_derive_internals
  • elastic_types_derive
  • elastic_types
  • elastic_derive
  • elastic

Some specifics

elastic

  • Client has been renamed to SyncClient and ClientBuilder has been renamed to SyncClientBuilder
  • Client::new has been removed in favour of SyncClientBuilder

elastic_types

This release refactors Date to start reducing dependence on chrono::DateTime, and to make sure date formats aren't implicitly changed. Some of these changes might turn out to be too restrictive and may be reverted in the future (allowing formats to change without explicit conversions).

  • Change remap methods to be static methods instead of instance methods
  • Add DateExpr for supporting date math expressions

Changes to Date

  • Change Date<F, M = DefaultDateMapping<F>> to Date<M>. So you can't just write Date<EpochMillis> anymore, it needs to be Date<DefaultDateMapping<EpochMillis>>. This simplifies the generics, and makes Date easier to work with. To get the ergonomics of Date<EpochMillis> back, you can use type aliases:
// For default date types with just a single format
type MyDateType = Date<DefaultDateMapping<EpochMillis>>;

// For default date types with any format
type MyDateType<F> = Date<DefaultDateMappinng<F>>;
  • Adds a DateValue and FormattableDateValue type
  • Use DateValue in the DateFormat::parse and DateFormat::format methods instead of chrono::DateTime
  • Remove the conversion from chrono::DateTime into Date<M> unless M::Format = ChronoFormat. This is because chrono::DateTime is already mappable with the ChronoFormat, so to make sure that formats aren't implicitly changed, you need to convert a chrono::DateTime into a DateValue first, which doesn't have any format:

Before:

let date = Date::from(chrono_date);

After:

let date = Date::from(DateValue::from(chrono_date));

Changes to GeoPoint

  • Like Date, GeoPoint<F, M = DefaultGeoPointMapping<F>> has been changed to GeoPoint<M>. Use the same type aliases approach for ergonomics

elastic_responses

  • Make all fields on response types private
  • Add iterators to response types. For BulkResponse and BulkErrorsResponse, call iter or into_iter. For SearchResponse call hits, into_hits, documents or into_documents.
  • Remove the SearchResponseOf and GetResponseOf types. Now SearchResponse and GetResponse require a generic type for the kind of document they contain. serde_json::Value is re-exported for convenience.