oxidecomputer/typify

Multiple use of `import_types!` causes compilation failures

JR-1991 opened this issue ยท 6 comments

First off, kudos to you for this library! It is very handy and easy to use ๐Ÿ™Œ

I am currently running into a problem where I want to use the import_types! macro to import multiple schemes. Specifically, I run into the following error using the code below:

import_types!(schema = "models/collection/create_body.json");
import_types!(schema = "models/collection/create_response.json");
the name `error` is defined multiple times
`error` must be defined only once in the type namespace of this module

I figured that one possible solution is to merge both schemes, but I would prefer to keep them separate due to the module's future expansion. Is there a way to achieve this while still using the macro?

Thanks in advance for your support!

ahl commented

Hmmm! Very good point. A workaround is to put both (or one I guess) into a mod, but that's kind of awful.

mod body {
    import_types!(schema = "models/collection/create_body.json");
}
mod response {
    import_types!(schema = "models/collection/create_response.json");
}

This isn't just a problem for the generated error mod. It can also be a problem for the generation of builder and default mods (depending on options and inputs). One solution might be to allow for multiple schema inputs to the import_types! macro... not sure I love that either. Another would be to choose unique names for the generated mods, perhaps based on the name of the input file--I also don't love that!

Any suggestions for an interface you'd prefer?

Thanks for the response and proposed solution. For now, I have gone with putting the response and body into a single schema. It works well!

I agree that these methods are not the most elegant way of handling multiple schemes. A possible solution I could think of would be to have a "main" scheme that references both the body and response schemes. This way, the interface can remain the same, and the schemes can stay separated without causing errors. As far as I know, external references are not possible yet or am I wrong about this?

I thought about something like this for the "main" scheme:

{
  "$schema": "http://json-schema.org/draft-07/schema",
  "title": "SomeRequest",
  "type": "object",
  "definitions": {
    "Response": {
      "$ref": "path/to/Response.json"
    },
    "Body": {
      "$ref": "path/to/Body.json"
    }
  }
}
ahl commented

Seems reasonable! In a future where typify supported 1. multiple files and 2. inline schemas, I could image something like this:

import_types!(
    schema = {
        "$defs": {
            "Response": { "$ref": "path/to/Response.json" },
            "Body": { "$ref": "path/to/Body.json" }
        }
    }
);

That's a really elegant solution! Can you give a rough estimate for when external schema refs will be implemented?

ahl commented

That's a really elegant solution! Can you give a rough estimate for when external schema refs will be implemented?

Sorry, I can't. I've been working on #579 little by little, but in my spare time. I'm eager to take a big step forward based on what we've learned from the assumptions and mistakes so far.

No worries, the current workaround does its job, and I am looking forward to the next version!