dsntk_recognizer/
model.rs1use crate::errors::err_invalid_hit_policy;
4use dsntk_common::DsntkError;
5
6#[derive(Debug)]
8pub struct DecisionTable {
9 pub information_item_name: Option<String>,
11 pub input_clauses: Vec<InputClause>,
13 pub output_clauses: Vec<OutputClause>,
15 pub rule_annotations: Vec<RuleAnnotationClause>,
17 pub rules: Vec<DecisionRule>,
19 pub hit_policy: HitPolicy,
21 pub aggregation: Option<BuiltinAggregator>,
23 pub preferred_orientation: DecisionTableOrientation,
25 pub output_label: Option<String>,
27}
28
29impl DecisionTable {
30 #[allow(clippy::too_many_arguments)]
32 pub fn new(
33 information_item_name: Option<String>,
34 input_clauses: Vec<InputClause>,
35 output_clauses: Vec<OutputClause>,
36 rule_annotations: Vec<RuleAnnotationClause>,
37 rules: Vec<DecisionRule>,
38 hit_policy: HitPolicy,
39 aggregation: Option<BuiltinAggregator>,
40 preferred_orientation: DecisionTableOrientation,
41 output_label: Option<String>,
42 ) -> Self {
43 Self {
44 information_item_name,
45 input_clauses,
46 output_clauses,
47 rule_annotations,
48 rules,
49 hit_policy,
50 aggregation,
51 preferred_orientation,
52 output_label,
53 }
54 }
55}
56
57#[derive(Debug)]
59pub struct InputClause {
60 pub input_expression: String,
62 pub allowed_input_values: Option<String>,
64}
65
66#[derive(Debug)]
68pub struct OutputClause {
69 pub name: Option<String>,
71 pub allowed_output_values: Option<String>,
73 pub default_output_entry: Option<String>,
75}
76
77#[derive(Debug)]
79pub struct RuleAnnotationClause {
80 pub name: String,
82}
83
84#[derive(Debug)]
86pub struct DecisionRule {
87 pub input_entries: Vec<InputEntry>,
89 pub output_entries: Vec<OutputEntry>,
91 pub annotation_entries: Vec<AnnotationEntry>,
93}
94
95#[derive(Debug)]
97pub struct InputEntry {
98 pub text: String,
100}
101
102#[derive(Debug)]
104pub struct OutputEntry {
105 pub text: String,
107}
108
109#[derive(Debug)]
111pub struct AnnotationEntry {
112 pub text: String,
114}
115
116#[derive(Debug, Copy, Clone, PartialEq, Eq)]
118pub enum HitPolicy {
119 Unique,
121 Any,
123 Priority,
125 First,
127 Collect(BuiltinAggregator),
129 OutputOrder,
131 RuleOrder,
133}
134
135impl TryFrom<&str> for HitPolicy {
136 type Error = DsntkError;
137 fn try_from(value: &str) -> dsntk_common::Result<Self, Self::Error> {
139 match value.trim() {
140 "U" => Ok(HitPolicy::Unique),
141 "A" => Ok(HitPolicy::Any),
142 "P" => Ok(HitPolicy::Priority),
143 "F" => Ok(HitPolicy::First),
144 "R" => Ok(HitPolicy::RuleOrder),
145 "O" => Ok(HitPolicy::OutputOrder),
146 "C" => Ok(HitPolicy::Collect(BuiltinAggregator::List)),
147 "C+" => Ok(HitPolicy::Collect(BuiltinAggregator::Sum)),
148 "C#" => Ok(HitPolicy::Collect(BuiltinAggregator::Count)),
149 "C<" => Ok(HitPolicy::Collect(BuiltinAggregator::Min)),
150 "C>" => Ok(HitPolicy::Collect(BuiltinAggregator::Max)),
151 other => Err(err_invalid_hit_policy(other)),
152 }
153 }
154}
155
156#[derive(Debug, Copy, Clone, PartialEq, Eq)]
158pub enum BuiltinAggregator {
159 List,
161 Count,
163 Sum,
165 Min,
167 Max,
169}
170
171#[derive(Debug, Copy, Clone, PartialEq, Eq)]
173pub enum DecisionTableOrientation {
174 RuleAsRow,
176 RuleAsColumn,
178 CrossTable,
180}