you are viewing a single comment's thread
view the rest of the comments
[–] 3 points 1 year ago (6 children)

I like the concept, and it's great in TS. Unfortunately, not as doable in other languages.

I'm a bit curious if it's possible to extend clap to do this in Rust though (specifically mutually-exclusive arg groups).

  • source
  • hideshow 6 child comments
  • [–] 11 points 1 year ago (2 children)

    clap already supports all this: https://docs.rs/clap/latest/clap/struct.Arg.html#method.conflicts_with It's just a great library, having you could think of and applying the same parse-don't-validate mentality.

  • source
  • parent
  • hideshow 2 child comments
  • [–] 9 points 1 year ago (1 child)

    This doesn't represent the mutual exclusivity through the type system (which is what the article is all about).

    I love clap and I use it a lot, but the only way to represent the exclusivity through the type system in Rust is through an enum.

  • source
  • parent
  • hideshow 1 child comment
  • [–] 5 points 1 year ago

    Agreed. As nice as clap is, it's not a combinator. Parser combinators have a the really nice feature of sharing the same "shape" as the data they parse, which makes them trivial to generate from a schema ... or to just use them to represent your schema in the first place ;) .

  • source
  • parent
  • [–] 5 points 1 year ago (2 children)

    Clap has dependent options and mutually-exclusive argument groups built-in: https://docs.rs/clap/latest/clap/_derive/_tutorial/index.html#argument-relations

    For the environment-specific requirements, you can use compiler feature flags...

  • source
  • parent
  • hideshow 2 child comments
  • [–] 6 points 1 year ago (1 child)

    Mentioned this to the other commenter, but this doesn't use the type system to enforce the mutual exclusivity constraint. In Rust, the main way to do that via the type system is through enums.

  • source
  • parent
  • hideshow 1 child comment
  • [–] 3 points 1 year ago

    Ah, fair enough. Not sure how to do that then.

    I was gonna say, I feel like the current method does a good enough job documenting that validation has happened, but I guess you do want it reflected in the structure of the type, so that the code that takes the information from the struct can safely make the assumption that some of the options don't exist. And then, yeah, it would be nice to not need a separate parsing step for that.

  • source
  • parent