use crate::Primitives;
pub trait Shape<P: Primitives> {
fn target_class(&self) -> &P::String;
type PropertyConstraint: PropertyConstraint<P>;
fn required_property(&self) -> &[Self::PropertyConstraint];
}
pub trait PropertyConstraint<P: Primitives> {
fn constraint_property(&self) -> &P::String;
fn constraint_range(&self) -> &P::String;
fn min_count(&self) -> P::NonNegativeInteger;
fn max_count(&self) -> P::NonNegativeInteger;
}
pub trait QuantumLevelShape<P: Primitives>: Shape<P> {}
pub trait EffectShape<P: Primitives>: Shape<P> {}
pub trait ParallelShape<P: Primitives>: Shape<P> {}
pub trait StreamShape<P: Primitives>: Shape<P> {}
pub trait DispatchShape<P: Primitives>: Shape<P> {}
pub trait LeaseShape<P: Primitives>: Shape<P> {}
pub trait GroundingShape<P: Primitives>: Shape<P> {}
pub trait ValidationResult<P: Primitives> {
type Shape: Shape<P>;
fn validation_shape(&self) -> &Self::Shape;
fn validation_target(&self) -> &P::String;
fn conforms(&self) -> P::Boolean;
}
pub trait PredicateShape<P: Primitives>: Shape<P> {}