- 
                Notifications
    You must be signed in to change notification settings 
- Fork 60
Description
Right now, in nexus/src/authz/api_resources.rs, we have "typed" and "generic" resources.  "typed" resources are resources to which we will allow users to assign roles -- the Fleet, Silos (eventually), Organizations and Projects.  Everything else is a generic FleetChild or ProjectChild with a type alias, like type Instance = ProjectChild.  The reason is just that there's a bunch of boilerplate for each resource, and given the current policy, nothing actually cares what type anything is, so it was easier to do it this way.
I only recently appreciated that this means you can pass an authz::Project where an authz::Instance is expected, which seems pretty dangerous.  That alone convinced me that we're better off with well-typed versions of these things.
It may help simplify the problem if we eliminate the constructors at each level for constructing child resources (e.g., Organization::project(project_id) -> Project).  That was a convenient pattern when I expected you'd be building these by hand.  But these are generally going to be built by the lookup_resource macro.  If we make this Project::from(Organization) instead, we can update the macro to use that, and it may make it quite a lot easier for us to generate the full set of authz types (since you don't have to generate any type-specific methods).