Skip to main content

gollum_ast/
item.rs

1//! Top-level item type for the Gollum AST.
2use crate::clause::{Fact, Rule};
3use crate::directive::Directive;
4use crate::query::Query;
5use std::fmt;
6
7/// A plain clause (fact or rule) for use in probabilistic items.
8#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
9pub enum PlainClause {
10    /// A fact clause.
11    Fact(Fact),
12    /// A rule clause.
13    Rule(Rule),
14}
15
16impl fmt::Display for PlainClause {
17    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
18        match self {
19            PlainClause::Fact(fact) => write!(f, "{}.", fact),
20            PlainClause::Rule(rule) => write!(f, "{}.", rule),
21        }
22    }
23}
24
25/// A probabilistic clause.
26#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
27pub struct Probabilistic {
28    /// Probability annotation
29    pub probability: f64,
30    /// The underlying clause
31    pub clause: PlainClause,
32}
33
34impl fmt::Display for Probabilistic {
35    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
36        write!(f, "{} :: {}", self.probability, self.clause)
37    }
38}
39
40/// A top-level item in a Gollum program.
41#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
42pub enum Item {
43    /// A fact item.
44    Fact(Fact),
45    /// A rule item.
46    Rule(Rule),
47    /// A query item.
48    Query(Query),
49    /// A directive item.
50    Directive(Directive),
51    /// A probabilistic clause item.
52    Probabilistic(Probabilistic),
53}
54
55impl fmt::Display for Item {
56    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
57        match self {
58            Item::Fact(fact) => write!(f, "{}.", fact),
59            Item::Rule(rule) => write!(f, "{}.", rule),
60            Item::Query(query) => write!(f, "{}", query),
61            Item::Directive(dir) => write!(f, "{}", dir),
62            Item::Probabilistic(prob) => write!(f, "{}", prob),
63        }
64    }
65}