-
Notifications
You must be signed in to change notification settings - Fork 86
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
RFC 53 implementation #1377
base: main
Are you sure you want to change the base?
RFC 53 implementation #1377
Conversation
Signed-off-by: Shaobo He <[email protected]>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Scanned through this, looks like a reasonable high-level approach to me
pub struct ValidatorEntityType { | ||
/// The name of the entity type. | ||
pub(crate) name: EntityType, | ||
|
||
/// The set of entity types that can be members of this entity type. When | ||
/// this structure is initially constructed, the field will contain direct | ||
/// children, but it will be updated to contain the closure of all | ||
/// descendants before it is used in any validation. | ||
pub descendants: HashSet<EntityType>, | ||
|
||
/// The attributes associated with this entity. | ||
pub(crate) attributes: Attributes, | ||
|
||
/// Indicates that this entity type may have additional attributes | ||
/// other than the declared attributes that may be accessed under partial | ||
/// schema validation. We do not know if they are present, and do not know | ||
/// their type when they are present. Attempting to access an undeclared | ||
/// attribute under standard validation is an error regardless of this flag. | ||
pub(crate) open_attributes: OpenTag, | ||
|
||
/// Tag type for this entity type. `None` indicates that entities of this | ||
/// type are not allowed to have tags. | ||
#[serde(skip_serializing_if = "Option::is_none")] | ||
pub(crate) tags: Option<Type>, | ||
pub enum ValidatorEntityType { | ||
Common { | ||
/// The name of the entity type. | ||
name: EntityType, | ||
|
||
/// The set of entity types that can be members of this entity type. When | ||
/// this structure is initially constructed, the field will contain direct | ||
/// children, but it will be updated to contain the closure of all | ||
/// descendants before it is used in any validation. | ||
descendants: HashSet<EntityType>, | ||
|
||
/// The attributes associated with this entity. | ||
attributes: Attributes, | ||
|
||
/// Indicates that this entity type may have additional attributes | ||
/// other than the declared attributes that may be accessed under partial | ||
/// schema validation. We do not know if they are present, and do not know | ||
/// their type when they are present. Attempting to access an undeclared | ||
/// attribute under standard validation is an error regardless of this flag. | ||
open_attributes: OpenTag, | ||
|
||
/// Tag type for this entity type. `None` indicates that entities of this | ||
/// type are not allowed to have tags. | ||
#[serde(skip_serializing_if = "Option::is_none")] | ||
tags: Option<Type>, | ||
}, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This change makes the fields pub
instead of pub(crate)
, this is probably fine, just drawing attention to this in case someone thinks they shouldn't be pub
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks pretty good
|
||
/// Return valid EID choices if the entity type is enumerated otherwise | ||
/// return `None` | ||
fn choices(&self) -> Option<Vec<SmolStr>>; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Might be better off returning slice or an iterator?
@@ -202,6 +202,7 @@ impl Validator { | |||
} else { | |||
Some( | |||
self.validate_entity_types(p) | |||
.chain(self.validate_enum_entity(p)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Noting that this will mean enum entity validation doesn't short-circuit, matching the current behavior for validating entity types and actions. This is a good design decision IMO, but might mean we run into some differences between the Rust and Lean impls in DRT, so I'll just leave a comment here so we don't forget that it's expected
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I was thinking if we should implement enum entity validity checking in the type checker. What's your thought on this?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I wouldn't do that in this PR. Could consider moving it along with the entity-type check later
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
@@ -202,6 +202,7 @@ impl Validator { | |||
} else { | |||
Some( | |||
self.validate_entity_types(p) | |||
.chain(self.validate_enum_entity(p)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I wouldn't do that in this PR. Could consider moving it along with the entity-type check later
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Description of changes
Issue #, if available
Checklist for requesting a review
The change in this PR is (choose one, and delete the other options):
cedar-policy
(e.g., addition of a new API).I confirm that this PR (choose one, and delete the other options):
I confirm that
cedar-spec
(choose one, and delete the other options):cedar-spec
, and how you have tested that your updates are correct.)I confirm that
docs.cedarpolicy.com
(choose one, and delete the other options):cedar-docs
. PRs should be targeted at astaging-X.Y
branch, notmain
.)