#[derive(Debug, Clone, PartialEq)]
pub enum AtomPrimitive {
AtomicNum(u8),
Symbol(String),
Aromatic(bool),
Charge(i8),
HCount(u8),
ImplicitHCount(u8),
Degree(u8),
RingMembership(bool),
RingSize(u8),
Wildcard,
Recursive(Box<QueryMolecule>),
Valence(u8),
RingBondCount(u8),
Hybridization(u8),
TotalConnectivity(u8),
RingCount(u8),
Isotope(u16),
Chirality(u8),
}
#[derive(Debug, Clone, PartialEq)]
pub enum AtomQuery {
Primitive(AtomPrimitive),
And(Box<AtomQuery>, Box<AtomQuery>),
Or(Box<AtomQuery>, Box<AtomQuery>),
Not(Box<AtomQuery>),
}
#[derive(Debug, Clone, PartialEq)]
pub enum BondPrimitive {
Single,
Double,
Triple,
Aromatic,
Any,
Ring,
Up,
Down,
}
#[derive(Debug, Clone, PartialEq)]
pub enum BondQuery {
Primitive(BondPrimitive),
And(Box<BondQuery>, Box<BondQuery>),
Or(Box<BondQuery>, Box<BondQuery>),
Not(Box<BondQuery>),
Any,
}
#[derive(Debug, Clone, PartialEq)]
pub struct QueryAtom {
pub query: AtomQuery,
}
#[derive(Debug, Clone, PartialEq)]
pub struct QueryBond {
pub atom1: usize,
pub atom2: usize,
pub query: BondQuery,
}
#[derive(Debug, Clone, Default, PartialEq)]
pub struct QueryMolecule {
pub atoms: Vec<QueryAtom>,
pub bonds: Vec<QueryBond>,
pub adj: Vec<Vec<(usize, usize)>>,
}
impl QueryMolecule {
pub fn new() -> Self {
Self::default()
}
pub fn add_atom(&mut self, query: AtomQuery) -> usize {
let idx = self.atoms.len();
self.atoms.push(QueryAtom { query });
self.adj.push(vec![]);
idx
}
pub fn add_bond(&mut self, a: usize, b: usize, query: BondQuery) {
let bidx = self.bonds.len();
self.bonds.push(QueryBond {
atom1: a,
atom2: b,
query,
});
self.adj[a].push((bidx, b));
self.adj[b].push((bidx, a));
}
pub fn atom_count(&self) -> usize {
self.atoms.len()
}
}