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
use std::collections::BTreeMap;

use serde::{Deserialize, Serialize};

use super::bindings::Bindings;
use super::runnable::Runnable;
use super::terms::*;
use super::traces::*;

#[allow(clippy::large_enum_variant)]
#[must_use]
#[derive(Clone, Debug, Serialize, Deserialize)]
pub enum QueryEvent {
    None,

    /// This runnable is complete with `result`.
    Done {
        result: bool,
    },

    /// Run `runnable`, and report the result to its parent using `call_id`
    /// when it completes.
    #[serde(skip)]
    Run {
        call_id: u64,
        runnable: Box<dyn Runnable>,
    },

    Debug {
        message: String,
    },

    MakeExternal {
        instance_id: u64,
        constructor: Term,
    },

    ExternalCall {
        /// Persistent id across all requests for results from the same external call.
        call_id: u64,
        /// The external instance to make this call on.
        instance: Term,
        /// Field name to lookup or method name to call. A class name indicates a constructor
        /// should be called.
        attribute: Symbol,
        /// List of arguments to a method call.
        args: Option<Vec<Term>>,
        /// A map of keyword arguments to a method call.
        kwargs: Option<BTreeMap<Symbol, Term>>,
    },

    /// Checks if the instance is an instance of (a subclass of) the class_tag.
    ExternalIsa {
        call_id: u64,
        instance: Term,
        class_tag: Symbol,
    },

    /// Starting from `base_tag`, traverse `path` fields and check if the result is an instance of
    /// `class_tag`.
    ExternalIsaWithPath {
        call_id: u64,
        base_tag: Symbol,
        path: TermList,
        class_tag: Symbol,
    },

    /// Checks if the left is more specific than right with respect to instance.
    ExternalIsSubSpecializer {
        call_id: u64,
        instance_id: u64,
        left_class_tag: Symbol,
        right_class_tag: Symbol,
    },

    /// Checks if left class tag is a subclass or the same class as right.
    ExternalIsSubclass {
        call_id: u64,
        left_class_tag: Symbol,
        right_class_tag: Symbol,
    },

    /// Unifies two external instances.
    ExternalUnify {
        call_id: u64,
        left_instance_id: u64,
        right_instance_id: u64,
    },

    Result {
        bindings: Bindings,
        trace: Option<TraceResult>,
    },

    ExternalOp {
        call_id: u64,
        operator: Operator,
        args: TermList,
    },

    NextExternal {
        call_id: u64,
        iterable: Term,
    },
}