Comments (10)
In most cases we use this when we receive a Matrix URI, or when the user wants to join a room by alias or ID, we need to differentiate between both:
- So we can find the room locally, we need to know if we should match the room ID or an alias,
- If we want to get the public room info, since there is no API for it currently in the spec we use the
/hierarchy
endpoint, but it works only with room IDs.
from ruma.
Technically, this still needs at least a PR to advertise the TryFrom
APIs to be resolved.
from ruma.
Yeah, this is somewhat of a weird API. We used to have RoomOrAliasId::into_either
as an optional thing (because it depended on the either
crate), but I don't think anybody was using it. Speaking of, I don't actually know whether anybody uses this impl (or the one for RoomAliasId
).
That said, this is not such an uncommon API. std
also has APIs where the E
of Result<T, E>
isn't actually an error. I'm inclined to keep the API as-is.
@zecakeh do you have an opinion on this?
from ruma.
Yeah, this is somewhat of a weird API. We used to have
RoomOrAliasId::into_either
as an optional thing (because it depended on theeither
crate), but I don't think anybody was using it. Speaking of, I don't actually know whether anybody uses this impl (or the one forRoomAliasId
).That said, this is not such an uncommon API.
std
also has APIs where theE
ofResult<T, E>
isn't actually an error. I'm inclined to keep the API as-is.@zecakeh do you have an opinion on this?
Isn't the either crate a transitive dependency (is that the correct term?) Of Ruma anyways? Having a fresh look on this I guess I understand now, RoomAliasId is the error variant because it just exists for human convenience but can be turned into RoomId through the API.
from ruma.
I guess I understand now, RoomAliasId is the error variant because it just exists for human convenience
That is not the case. The "opposite" impl for &RoomAliasId
where it is the Ok
and &RoomId
is the Err
also exists:
impl<'a> TryFrom<&'a RoomOrAliasId> for &'a RoomAliasId {
type Error = &'a RoomId;
fn try_from(id: &'a RoomOrAliasId) -> Result<&'a RoomAliasId, &'a RoomId> {
match id.variant() {
Variant::RoomAliasId => Ok(RoomAliasId::from_borrowed(id.as_str())),
Variant::RoomId => Err(RoomId::from_borrowed(id.as_str())),
}
}
}
So you can do both RoomAliasId::try_from(room_or_alias_id)
and RoomId::try_from(room_or_alias_id)
.
from ruma.
As a client dev, I wasn't even aware that this was a possibility to get one type or the other and I am pretty we implemented something in Fractal to be able to match an enum for this.
So we need to document this API on the type's description in my opinion. I don't really prefer Either
over Result
. And I don't think this Variant
enum is useful publicly. If we make an enum public it should probably use newtype variants to get the typed strings directly.
from ruma.
Would be interesting to know what Fractal uses this for!
from ruma.
So, should I close this issue now that the decision has been made?
from ruma.
Technically, this still needs at least a PR to advertise the
TryFrom
APIs to be resolved.
Could you elaborate on this?
from ruma.
We need to spell out in the docs of the types that the user can convert an (Owned)RoomOrAliasId
to an (Owned)RoomId
or (Owned)RoomAliasId
by using the TryFrom
/TryInto
implementations.
from ruma.
Related Issues (20)
- How to send encrypted message to encrypted room HOT 3
- When user reply to their message, the reply mentions the current user HOT 1
- API responses always return a `200 OK` status code HOT 4
- Support optional path parameters for endpoints HOT 1
- Implement Matrix 1.11 changes HOT 1
- Make it harder to accidentally log sensitive data like user IDs HOT 7
- RoomMemberUnsigned is only useful in federation, but not used by servers HOT 5
- ruma rejects `Authorization: X-Matrix ...` headers that include optional whitespace around parameter pairs HOT 1
- `failures` is optional in responses to `/keys/signatures/upload` HOT 2
- Choose between `DeviceKeyId` and `DeviceSigningKeyId` HOT 6
- Handle encrypted stickers
- Implement `Borrow`/`Hash`/`Eq` for `ThirdPartyIdentifier` HOT 1
- `ProtocolInstanceInit` is exhaustive but has a field behind a cargo feature HOT 1
- `ThirdpartyIdCredentials`' `id_access_token` field should be optional HOT 1
- `AnyGlobalAccountDataEvent::SecretStorageKey` cannot be deserialized
- Provide a type for the `Content-Disposition` HTTP header. HOT 1
- Serialization of a room message event content with a thread relationship fails
- Auth checks for restricted joins fail when format of rules is unexpected HOT 1
- Prefer web_time types over std::time HOT 1
- Markdown constructors do not detect all markdown syntax HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from ruma.