use crate::SbolClass;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[non_exhaustive]
pub enum Cardinality {
ExactlyOne,
ZeroOrOne,
OneOrMore,
ZeroOrMore,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[non_exhaustive]
pub enum ValueKind {
Uri,
Url,
String,
Integer,
Long,
Float,
DateTime,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[non_exhaustive]
pub enum TargetClass {
Sbol(SbolClass),
ProvActivity,
ProvAgent,
ProvAssociation,
ProvPlan,
ProvUsage,
OmMeasure,
OmUnit,
OmPrefix,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[non_exhaustive]
pub struct ReferenceSpec {
pub target: TargetClass,
pub require_local: bool,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[non_exhaustive]
pub struct FieldDescriptor {
pub predicate: &'static str,
pub rule: &'static str,
pub cardinality: Cardinality,
pub value_kind: ValueKind,
pub reference: Option<ReferenceSpec>,
}
#[derive(Clone, Copy, Debug)]
#[non_exhaustive]
pub struct ClassDescriptor {
pub parents: &'static [&'static str],
pub fields: &'static [FieldDescriptor],
}
pub fn class_descriptor(class_iri: &str) -> Option<ClassDescriptor> {
crate::validation::class_spec(class_iri)
}
pub fn class_fields(class: SbolClass) -> &'static [FieldDescriptor] {
class_descriptor(class.iri())
.map(|descriptor| descriptor.fields)
.unwrap_or(&[])
}