Merge pull request #885 from teloxide/gatifydownload

Use GATs in `Download`
This commit is contained in:
Sima Kinsart 2023-06-02 02:51:25 +00:00 committed by GitHub
commit 9b9c1509b1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 37 additions and 35 deletions

View file

@ -24,7 +24,7 @@ env:
# - **/README.md # - **/README.md
# - **/src/lib.rs # - **/src/lib.rs
# - down below in a matrix # - down below in a matrix
rust_msrv: 1.64.0 rust_msrv: 1.65.0
CI: 1 CI: 1
@ -87,7 +87,7 @@ jobs:
toolchain: nightly-2023-05-28 toolchain: nightly-2023-05-28
features: "--features full nightly" features: "--features full nightly"
- rust: msrv - rust: msrv
toolchain: 1.64.0 toolchain: 1.65.0
features: "--features full" features: "--features full"
steps: steps:

View file

@ -5,7 +5,7 @@ members = ["crates/*"]
# The settings below will be applied to all crates in the workspace # The settings below will be applied to all crates in the workspace
[workspace.package] [workspace.package]
# MSRV (minimal supported Rust version). # MSRV (minimal supported Rust version).
rust-version = "1.64" rust-version = "1.65"
edition = "2021" edition = "2021"
license = "MIT" license = "MIT"

View file

@ -58,7 +58,7 @@ $ set TELOXIDE_TOKEN=<Your token here>
$ $env:TELOXIDE_TOKEN=<Your token here> $ $env:TELOXIDE_TOKEN=<Your token here>
``` ```
4. Make sure that your Rust compiler is up to date (`teloxide` currently requires rustc at least version 1.64): 4. Make sure that your Rust compiler is up to date (`teloxide` currently requires rustc at least version 1.65):
```bash ```bash
# If you're using stable # If you're using stable
$ rustup update stable $ rustup update stable

View file

@ -45,10 +45,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- `RequestError::RetryAfter` single fields type to `Seconds` ([#859][pr859]) - `RequestError::RetryAfter` single fields type to `Seconds` ([#859][pr859])
- `CallbackGame`, `ForumTopicClosed`, `ForumTopicReopened`, `GeneralForumTopicHidden`, `GeneralForumTopicUnhidden` and `WriteAccessAllowed` structures - `CallbackGame`, `ForumTopicClosed`, `ForumTopicReopened`, `GeneralForumTopicHidden`, `GeneralForumTopicUnhidden` and `WriteAccessAllowed` structures
are now defined as named (`struct S {}`) instead of unit (`struct S;`) in order to fix their deserialization ([#876][pr876]) are now defined as named (`struct S {}`) instead of unit (`struct S;`) in order to fix their deserialization ([#876][pr876])
- `Download` now uses GAT feature on the `Fut` and `Err` associated types, instead of a lifetime on the whole trait ([#885][pr885])
- MSRV (Minimal Supported Rust Version) was bumped from `1.64.0` to `1.65.0`
[pr852]: https://github.com/teloxide/teloxide/pull/853 [pr852]: https://github.com/teloxide/teloxide/pull/853
[pr859]: https://github.com/teloxide/teloxide/pull/859 [pr859]: https://github.com/teloxide/teloxide/pull/859
[pr876]: https://github.com/teloxide/teloxide/pull/876 [pr876]: https://github.com/teloxide/teloxide/pull/876
[pr885]: https://github.com/teloxide/teloxide/pull/885
### Deprecated ### Deprecated

View file

@ -27,7 +27,7 @@
```toml ```toml
teloxide-core = "0.9" teloxide-core = "0.9"
``` ```
_Compiler support: requires rustc 1.64+_. _Compiler support: requires rustc 1.65+_.
[`teloxide`]: https://docs.rs/teloxide [`teloxide`]: https://docs.rs/teloxide
[Telegram Bot API]: https://core.telegram.org/bots/api [Telegram Bot API]: https://core.telegram.org/bots/api

View file

@ -177,7 +177,6 @@ where
} }
download_forward! { download_forward! {
'w
B B
AutoSend<B> AutoSend<B>
{ this => this.inner() } { this => this.inner() }

View file

@ -201,7 +201,6 @@ where
} }
download_forward! { download_forward! {
'w
B B
CacheMe<B> CacheMe<B>
{ this => this.inner() } { this => this.inner() }

View file

@ -196,7 +196,6 @@ impl<B: Requester> Requester for DefaultParseMode<B> {
} }
download_forward! { download_forward! {
'w
B B
DefaultParseMode<B> DefaultParseMode<B>
{ this => this.inner() } { this => this.inner() }

View file

@ -182,7 +182,6 @@ where
} }
download_forward! { download_forward! {
'w
B B
Throttle<B> Throttle<B>
{ this => this.inner() } { this => this.inner() }

View file

@ -8,18 +8,18 @@ use crate::{
DownloadError, DownloadError,
}; };
impl<'w> Download<'w> for Bot { impl Download for Bot {
type Err = DownloadError; type Err<'dst> = DownloadError;
// I would like to unbox this, but my coworkers will kill me if they'll see yet // I would like to unbox this, but my coworkers will kill me if they'll see yet
// another hand written `Future`. (waffle) // another hand written `Future`. (waffle)
type Fut = BoxFuture<'w, Result<(), Self::Err>>; type Fut<'dst> = BoxFuture<'dst, Result<(), Self::Err<'dst>>>;
fn download_file( fn download_file<'dst>(
&self, &self,
path: &str, path: &str,
destination: &'w mut (dyn AsyncWrite + Unpin + Send), destination: &'dst mut (dyn AsyncWrite + Unpin + Send),
) -> Self::Fut { ) -> Self::Fut<'dst> {
net::download_file( net::download_file(
&self.client, &self.client,
reqwest::Url::clone(&*self.api_url), reqwest::Url::clone(&*self.api_url),

View file

@ -7,7 +7,7 @@
//!```toml //!```toml
//! teloxide_core = "0.9" //! teloxide_core = "0.9"
//! ``` //! ```
//! _Compiler support: requires rustc 1.64+_. //! _Compiler support: requires rustc 1.65+_.
//! //!
//! ``` //! ```
//! # async { //! # async {

View file

@ -372,26 +372,26 @@ macro_rules! impl_payload {
} }
macro_rules! download_forward { macro_rules! download_forward {
($l:lifetime $T:ident $S:ty {$this:ident => $inner:expr}) => { ($T:ident $S:ty {$this:ident => $inner:expr}) => {
impl<$l, $T: $crate::net::Download<$l>> $crate::net::Download<$l> for $S { impl<$T: $crate::net::Download> $crate::net::Download for $S {
type Err = <$T as $crate::net::Download<$l>>::Err; type Err<'dst> = <$T as $crate::net::Download>::Err<'dst>;
type Fut = <$T as $crate::net::Download<$l>>::Fut; type Fut<'dst> = <$T as $crate::net::Download>::Fut<'dst>;
fn download_file( fn download_file<'dst>(
&self, &self,
path: &str, path: &str,
destination: &'w mut (dyn tokio::io::AsyncWrite destination: &'dst mut (dyn tokio::io::AsyncWrite
+ core::marker::Unpin + core::marker::Unpin
+ core::marker::Send), + core::marker::Send),
) -> Self::Fut { ) -> Self::Fut<'dst> {
let $this = self; let $this = self;
($inner).download_file(path, destination) ($inner).download_file(path, destination)
} }
type StreamErr = <$T as $crate::net::Download<$l>>::StreamErr; type StreamErr = <$T as $crate::net::Download>::StreamErr;
type Stream = <$T as $crate::net::Download<$l>>::Stream; type Stream = <$T as $crate::net::Download>::Stream;
fn download_file_stream(&self, path: &str) -> Self::Stream { fn download_file_stream(&self, path: &str) -> Self::Stream {
let $this = self; let $this = self;

View file

@ -12,14 +12,17 @@ use tokio::io::{AsyncWrite, AsyncWriteExt};
use crate::{errors::DownloadError, net::file_url}; use crate::{errors::DownloadError, net::file_url};
/// A trait for downloading files from Telegram. /// A trait for downloading files from Telegram.
// FIXME(waffle): ideally, this lifetime ('w) shouldn't be here, but we can't pub trait Download {
// help it without GATs
pub trait Download<'w> {
/// An error returned from [`download_file`](Self::download_file). /// An error returned from [`download_file`](Self::download_file).
type Err; type Err<'dst>;
/// A future returned from [`download_file`](Self::download_file). /// A future returned from [`download_file`](Self::download_file).
type Fut: Future<Output = Result<(), Self::Err>> + Send; type Fut<'dst>: Future<Output = Result<(), Self::Err<'dst>>> + Send;
// NOTE: We currently only allow borrowing `dst` in the future,
// however we could also allow borrowing `self` or `path`.
// This doesn't seem useful for our current implementers of
// `Download`, but we could.
/// Download a file from Telegram into `destination`. /// Download a file from Telegram into `destination`.
/// ///
@ -49,11 +52,11 @@ pub trait Download<'w> {
/// ///
/// [`GetFile`]: crate::payloads::GetFile /// [`GetFile`]: crate::payloads::GetFile
/// [`download_file_stream`]: Self::download_file_stream /// [`download_file_stream`]: Self::download_file_stream
fn download_file( fn download_file<'dst>(
&self, &self,
path: &str, path: &str,
destination: &'w mut (dyn AsyncWrite + Unpin + Send), destination: &'dst mut (dyn AsyncWrite + Unpin + Send),
) -> Self::Fut; ) -> Self::Fut<'dst>;
/// An error returned from /// An error returned from
/// [`download_file_stream`](Self::download_file_stream). /// [`download_file_stream`](Self::download_file_stream).