wierd interaction due to two `twitch_types` crates used
Emilgardis opened this issue · 5 comments
Due to how we currently have twitch_types
used in twitch_api2
and twitch_oauth2
, there's a wierd interaction happening due to the two twitch_api crates used are not the same due to pathing.
To circumvent the issue, users that have specified twitch_api2
as a path or git dependency will need to do the following:
[dependencies]
twitch_api = { git = "https://github.com/twitch-rs/twitch_api/" }
# workaround for https://github.com/twitch-rs/twitch_api/issues/256
[patch.crates-io.twitch_types]
git = "https://github.com/twitch-rs/twitch_api"
this issue manifests as
error[E0277]: the trait bound `&twitch_types::basic::UserIdRef: IntoCow<'_, UserIdRef>` is not satisfied
--> /Users/emil/.cargo/git/checkouts/twitch_api-e5fea103d3f2733c/e9ed7c5/src/helix/client/client_ext.rs:302:70
|
302 | let req = helix::streams::GetFollowedStreamsRequest::user_id(user_id);
| -------------------------------------------------- ^^^^^^^ the trait `IntoCow<'_, UserIdRef>` is not implemented for `&twitch_types::basic::UserIdRef`
| |
| required by a bound introduced by this call
|
= help: the following other types implement trait `IntoCow<'a, Ref>`:
<&'a BadgeSetId as IntoCow<'a, BadgeSetIdRef>>
<&'a BadgeSetIdRef as IntoCow<'a, BadgeSetIdRef>>
<&'a BlockedTermId as IntoCow<'a, BlockedTermIdRef>>
<&'a BlockedTermIdRef as IntoCow<'a, BlockedTermIdRef>>
<&'a CategoryId as IntoCow<'a, CategoryIdRef>>
<&'a CategoryIdRef as IntoCow<'a, CategoryIdRef>>
<&'a CharityCampaignId as IntoCow<'a, CharityCampaignIdRef>>
<&'a CharityCampaignIdRef as IntoCow<'a, CharityCampaignIdRef>>
and 83 others
note: required by a bound in `GetFollowedStreamsRequest::<'a>::user_id`
--> /Users/emil/.cargo/git/checkouts/twitch_api-e5fea103d3f2733c/e9ed7c5/src/helix/endpoints/streams/get_followed_streams.rs:70:34
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `GetFollowedStreamsRequest::<'a>::user_id`
error[E0277]: the trait bound `&twitch_types::basic::UserIdRef: IntoCow<'_, UserIdRef>` is not satisfied
--> /Users/emil/.cargo/git/checkouts/twitch_api-e5fea103d3f2733c/e9ed7c5/src/helix/client/client_ext.rs:343:92
|
343 | let req = helix::subscriptions::GetBroadcasterSubscriptionsRequest::broadcaster_id(user_id);
| ------------------------------------------------------------------------ ^^^^^^^ the trait `IntoCow<'_, UserIdRef>` is not implemented for `&twitch_types::basic::UserIdRef`
| |
| required by a bound introduced by this call
|
= help: the following other types implement trait `IntoCow<'a, Ref>`:
<&'a BadgeSetId as IntoCow<'a, BadgeSetIdRef>>
<&'a BadgeSetIdRef as IntoCow<'a, BadgeSetIdRef>>
<&'a BlockedTermId as IntoCow<'a, BlockedTermIdRef>>
<&'a BlockedTermIdRef as IntoCow<'a, BlockedTermIdRef>>
<&'a CategoryId as IntoCow<'a, CategoryIdRef>>
<&'a CategoryIdRef as IntoCow<'a, CategoryIdRef>>
<&'a CharityCampaignId as IntoCow<'a, CharityCampaignIdRef>>
<&'a CharityCampaignIdRef as IntoCow<'a, CharityCampaignIdRef>>
and 83 others
note: required by a bound in `GetBroadcasterSubscriptionsRequest::<'a>::broadcaster_id`
--> /Users/emil/.cargo/git/checkouts/twitch_api-e5fea103d3f2733c/e9ed7c5/src/helix/endpoints/subscriptions/get_broadcaster_subscriptions.rs:69:48
|
69 | pub fn broadcaster_id(broadcaster_id: impl types::IntoCow<'a, types::UserIdRef> + 'a) -> Self {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `GetBroadcasterSubscriptionsRequest::<'a>::broadcaster_id`
For more information about this error, try `rustc --explain E0277`.
error: could not compile `twitch_api` due to 2 previous errors
Can this be solved neatly without requiring a patch?
For future visitors, after the move from twitch_api2
to twitch-rs/twitch_api
:
[dependencies]
# rev isn't required, but it's good to pin a specific revision
twitch_api = { git = "https://github.com/twitch-rs/twitch_api.git", rev = "340a582" }
# workaround for https://github.com/twitch-rs/twitch_api/issues/256
[patch.crates-io.twitch_types]
git = "https://github.com/twitch-rs/twitch_api.git"
rev = "340a582" # only if you pinned the repo to a specific revision
If you don't want to rename every import of twitch_api2
to twitch_api
, add the following line in your main.rs
/ lib.rs
:
extern crate twitch_api as twitch_api2;
It's also possible to do
[dependencies]
twitch_api2 = {package = "twitch_api", ...}
Oh didn't know that. It's much better than extern crate
.
Can this be solved neatly without requiring a patch?
Just ran into this again. Maybe this should be a monorepo instead of using submodules? I'm not sure how releasing works then, however.
I don't think monorepo solves it, since the source for the twitch_types
would still be crates-io
when twitch_api
is included as a git
source.
eframe
/egui
has the same problem, see https://github.com/emilk/eframe_template/blob/02ee968537e783e375a0e439426518bf91e762b6/Cargo.toml#L41-L43