shex_validation/
atom.rs

1use std::{fmt::Display, hash::Hash};
2
3/// An atom can either be positive or negative
4#[derive(Hash, PartialEq, Eq, Debug, Clone)]
5pub enum Atom<A> {
6    Pos(A),
7    Neg(A),
8}
9
10impl<A> Atom<A>
11where
12    A: Clone,
13{
14    pub fn pos(pa: &A) -> Atom<A> {
15        Atom::Pos(pa.clone())
16    }
17
18    pub fn neg(na: &A) -> Atom<A> {
19        Atom::Neg(na.clone())
20    }
21
22    pub fn negated(&self) -> Atom<A> {
23        match self {
24            Atom::Pos(value) => Atom::Neg(value.clone()),
25            Atom::Neg(value) => Atom::Pos(value.clone()),
26        }
27    }
28
29    pub fn get_value(&self) -> &A {
30        match self {
31            Atom::Pos(value) => value,
32            Atom::Neg(value) => value,
33        }
34    }
35}
36
37impl<A> Display for Atom<A>
38where
39    A: Display,
40{
41    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
42        match self {
43            Atom::Pos(value) => write!(f, "+({})", value),
44            Atom::Neg(value) => write!(f, "!({})", value),
45        }
46    }
47}