1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
use fastobo_derive_internal::FromStr;
use fastobo_derive_internal::OboClause;
use crate::ast::*;
use crate::error::SyntaxError;
use crate::parser::Cache;
use crate::parser::FromPair;
use crate::semantics::OboClause;
use crate::syntax::pest::iterators::Pair;
use crate::syntax::Rule;
#[derive(Clone, Debug, Eq, FromStr, Hash, Ord, OboClause, PartialEq, PartialOrd)]
pub enum InstanceClause {
#[clause(cardinality = "ZeroOrOne")]
IsAnonymous(bool),
#[clause(cardinality = "ZeroOrOne")]
Name(Box<UnquotedString>),
#[clause(cardinality = "One")]
Namespace(Box<NamespaceIdent>),
AltId(Box<Ident>),
#[clause(cardinality = "ZeroOrOne")]
Def(Box<Definition>),
Comment(Box<UnquotedString>),
Subset(Box<SubsetIdent>),
Synonym(Box<Synonym>),
Xref(Box<Xref>),
PropertyValue(Box<PropertyValue>),
InstanceOf(Box<ClassIdent>),
Relationship(Box<RelationIdent>, Box<Ident>), #[clause(cardinality = "ZeroOrOne")]
CreatedBy(Box<UnquotedString>),
#[clause(cardinality = "ZeroOrOne")]
CreationDate(Box<CreationDate>),
#[clause(cardinality = "ZeroOrOne")]
IsObsolete(bool),
ReplacedBy(Box<InstanceIdent>),
Consider(Box<Ident>),
}
clause_impl_from!(InstanceClause);
impl<'i> FromPair<'i> for InstanceClause {
const RULE: Rule = Rule::InstanceClause;
unsafe fn from_pair_unchecked(
pair: Pair<'i, Rule>,
cache: &Cache,
) -> Result<Self, SyntaxError> {
let mut inner = pair.into_inner();
match inner.next().unwrap().as_rule() {
Rule::IsAnonymousTag => {
let b = bool::from_pair_unchecked(inner.next().unwrap(), cache)?;
Ok(InstanceClause::IsAnonymous(b))
}
Rule::NameTag => {
let n = UnquotedString::from_pair_unchecked(inner.next().unwrap(), cache)?;
Ok(InstanceClause::Name(Box::new(n)))
}
Rule::NamespaceTag => {
let ns = NamespaceIdent::from_pair_unchecked(inner.next().unwrap(), cache)?;
Ok(InstanceClause::Namespace(Box::new(ns)))
}
Rule::AltIdTag => {
let id = Ident::from_pair_unchecked(inner.next().unwrap(), cache)?;
Ok(InstanceClause::AltId(Box::new(id)))
}
Rule::DefTag => {
let def = Definition::from_pair_unchecked(inner.next().unwrap(), cache)?;
Ok(InstanceClause::Def(Box::new(def)))
}
Rule::CommentTag => {
let s = UnquotedString::from_pair_unchecked(inner.next().unwrap(), cache)?;
Ok(InstanceClause::Comment(Box::new(s)))
}
Rule::SubsetTag => {
let id = SubsetIdent::from_pair_unchecked(inner.next().unwrap(), cache)?;
Ok(InstanceClause::Subset(Box::new(id)))
}
Rule::SynonymTag => {
let syn = Synonym::from_pair_unchecked(inner.next().unwrap(), cache)?;
Ok(InstanceClause::Synonym(Box::new(syn)))
}
Rule::XrefTag => {
let xref = Xref::from_pair_unchecked(inner.next().unwrap(), cache)?;
Ok(InstanceClause::Xref(Box::new(xref)))
}
Rule::PropertyValueTag => {
let pv = PropertyValue::from_pair_unchecked(inner.next().unwrap(), cache)?;
Ok(InstanceClause::PropertyValue(Box::new(pv)))
}
Rule::InstanceOfTag => {
let id = ClassIdent::from_pair_unchecked(inner.next().unwrap(), cache)?;
Ok(InstanceClause::InstanceOf(Box::new(id)))
}
Rule::RelationshipTag => {
let r = RelationIdent::from_pair_unchecked(inner.next().unwrap(), cache)?;
let id = Ident::from_pair_unchecked(inner.next().unwrap(), cache)?;
Ok(InstanceClause::Relationship(Box::new(r), Box::new(id)))
}
Rule::CreatedByTag => {
let s = UnquotedString::from_pair_unchecked(inner.next().unwrap(), cache)?;
Ok(InstanceClause::CreatedBy(Box::new(s)))
}
Rule::CreationDateTag => {
let dt = CreationDate::from_pair_unchecked(inner.next().unwrap(), cache)?;
Ok(InstanceClause::CreationDate(Box::new(dt)))
}
Rule::IsObsoleteTag => {
let b = bool::from_pair_unchecked(inner.next().unwrap(), cache)?;
Ok(InstanceClause::IsObsolete(b))
}
Rule::ReplacedByTag => {
let id = InstanceIdent::from_pair_unchecked(inner.next().unwrap(), cache)?;
Ok(InstanceClause::ReplacedBy(Box::new(id)))
}
Rule::ConsiderTag => {
let id = Ident::from_pair_unchecked(inner.next().unwrap(), cache)?;
Ok(InstanceClause::Consider(Box::new(id)))
}
_ => unreachable!(),
}
}
}
impl<'i> FromPair<'i> for Line<InstanceClause> {
const RULE: Rule = Rule::InstanceClauseLine;
unsafe fn from_pair_unchecked(
pair: Pair<'i, Rule>,
cache: &Cache,
) -> Result<Self, SyntaxError> {
let mut inner = pair.into_inner();
let clause = InstanceClause::from_pair_unchecked(inner.next().unwrap(), cache)?;
let eol = inner.next().unwrap();
Ok(Eol::from_pair_unchecked(eol, cache)?.and_inner(clause))
}
}