Git Product home page Git Product logo

Comments (10)

zecakeh avatar zecakeh commented on September 20, 2024 2

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.

zecakeh avatar zecakeh commented on September 20, 2024 1

Technically, this still needs at least a PR to advertise the TryFrom APIs to be resolved.

from ruma.

jplatte avatar jplatte commented on September 20, 2024

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.

avdb13 avatar avdb13 commented on September 20, 2024

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?

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.

jplatte avatar jplatte commented on September 20, 2024

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.

zecakeh avatar zecakeh commented on September 20, 2024

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.

jplatte avatar jplatte commented on September 20, 2024

Would be interesting to know what Fractal uses this for!

from ruma.

avdb13 avatar avdb13 commented on September 20, 2024

So, should I close this issue now that the decision has been made?

from ruma.

avdb13 avatar avdb13 commented on September 20, 2024

Technically, this still needs at least a PR to advertise the TryFrom APIs to be resolved.

Could you elaborate on this?

from ruma.

zecakeh avatar zecakeh commented on September 20, 2024

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)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.