argumentation_values/
scheme_bridge.rs1use crate::types::{Value, ValueAssignment};
21use argumentation_schemes::SchemeInstance;
22use std::collections::HashMap;
23use std::hash::Hash;
24
25pub const DEFAULT_VALUES_SCHEME_NAME: &str = "Argument from Values";
28
29pub fn from_scheme_instances<'a, A, I, F>(
46 instances: I,
47 to_arg: F,
48) -> ValueAssignment<A>
49where
50 A: Eq + Hash + Clone,
51 I: IntoIterator<Item = (&'a SchemeInstance, &'a HashMap<String, String>)>,
52 F: Fn(&SchemeInstance) -> A,
53{
54 from_scheme_instances_with_name(instances, to_arg, DEFAULT_VALUES_SCHEME_NAME)
55}
56
57pub fn from_scheme_instances_with_name<'a, A, I, F>(
60 instances: I,
61 to_arg: F,
62 target_scheme_name: &str,
63) -> ValueAssignment<A>
64where
65 A: Eq + Hash + Clone,
66 I: IntoIterator<Item = (&'a SchemeInstance, &'a HashMap<String, String>)>,
67 F: Fn(&SchemeInstance) -> A,
68{
69 let mut assignment = ValueAssignment::new();
70 for (instance, bindings) in instances {
71 if instance.scheme_name.as_str() != target_scheme_name {
72 continue;
73 }
74 let Some(value_str) = bindings.get("value") else {
75 continue;
76 };
77 let arg = to_arg(instance);
78 assignment.promote(arg, Value::new(value_str.clone()));
79 }
80 assignment
81}
82
83#[cfg(test)]
84mod tests {
85 use super::*;
86 use argumentation_schemes::catalog::default_catalog;
87
88 #[test]
89 fn extracts_value_from_argument_from_values_scheme() {
90 let registry = default_catalog();
91 let scheme = registry.by_key("argument_from_values").unwrap();
92
93 let mut bindings = HashMap::new();
94 bindings.insert("action".into(), "uphold_honor".into());
95 bindings.insert("value".into(), "honor".into());
96 bindings.insert("agent".into(), "alice".into());
97 let instance = scheme.instantiate(&bindings).unwrap();
98
99 let to_arg = |inst: &SchemeInstance| inst.conclusion.to_string();
100 let assignment = from_scheme_instances(
101 std::iter::once((&instance, &bindings)),
102 to_arg,
103 );
104 let arg = instance.conclusion.to_string();
105 let values = assignment.values(&arg);
106 assert_eq!(values.len(), 1);
107 assert_eq!(values[0].as_str(), "honor");
108 }
109
110 #[test]
111 fn skips_non_value_schemes() {
112 let registry = default_catalog();
113 let scheme = registry
114 .by_key("argument_from_expert_opinion")
115 .expect("argument_from_expert_opinion in default catalog");
116
117 let mut bindings = HashMap::new();
118 bindings.insert("expert".into(), "alice".into());
119 bindings.insert("domain".into(), "military".into());
120 bindings.insert("claim".into(), "fortify".into());
121 let instance = scheme.instantiate(&bindings).unwrap();
122
123 let to_arg = |inst: &SchemeInstance| inst.conclusion.to_string();
124 let assignment = from_scheme_instances(
125 std::iter::once((&instance, &bindings)),
126 to_arg,
127 );
128 assert!(assignment.values(&instance.conclusion.to_string()).is_empty());
130 }
131
132 #[test]
133 fn custom_scheme_name_supported() {
134 let registry = default_catalog();
139 let scheme = registry.by_key("argument_from_values").unwrap();
140 let mut bindings = HashMap::new();
141 bindings.insert("action".into(), "do_x".into());
142 bindings.insert("value".into(), "honor".into());
143 bindings.insert("agent".into(), "alice".into());
144 let instance = scheme.instantiate(&bindings).unwrap();
145
146 let to_arg = |inst: &SchemeInstance| inst.conclusion.to_string();
147 let assignment = from_scheme_instances_with_name(
148 std::iter::once((&instance, &bindings)),
149 to_arg,
150 "Some Other Scheme Name",
151 );
152 assert!(assignment.values(&instance.conclusion.to_string()).is_empty());
154 }
155}