#![allow(dead_code)]
use wasm4pm_compat::declare::{
Activity, DeclareConstraint, DeclareRefusal, DeclareScope, DeclareTemplate,
OcDeclareConstraint, OcDeclareRefusal,
};
fn main() {
println!("=== Declare Constraint Model: Order Fulfillment Process ===\n");
let submit = Activity::new("submit_order");
let approve = Activity::new("approve_order");
let pick = Activity::new("pick_items");
let ship = Activity::new("ship_order");
let deliver = Activity::new("deliver_order");
let cancel = Activity::new("cancel_order");
let response = DeclareConstraint::binary(
DeclareTemplate::Response,
submit.clone(),
approve.clone(),
DeclareScope::SingleObjectScope("order".into()),
);
println!("Response constraint:");
println!(
" template = {:?} (arity {})",
response.template,
response.template.arity()
);
println!(" activation = {:?}", response.activation);
println!(" target = {:?}", response.target);
println!(" is_negative? {}", response.template.is_negative());
println!(" is_chain? {}", response.template.is_chain());
println!();
let precedence = DeclareConstraint::binary(
DeclareTemplate::Precedence,
pick.clone(),
ship.clone(),
DeclareScope::SingleObjectScope("order".into()),
);
println!("Precedence constraint:");
println!(
" template = {:?} (arity {})",
precedence.template,
precedence.template.arity()
);
println!(" activation = {:?}", precedence.activation);
println!(" target = {:?}", precedence.target);
println!();
let succession = DeclareConstraint::binary(
DeclareTemplate::Succession,
ship.clone(),
deliver.clone(),
DeclareScope::SingleObjectScope("order".into()),
);
println!("Succession constraint (= Response ∧ Precedence):");
println!(
" template = {:?} (arity {})",
succession.template,
succession.template.arity()
);
println!(" activation = {:?}", succession.activation);
println!(" target = {:?}", succession.target);
println!();
let no_cancel = DeclareConstraint::unary(
DeclareTemplate::Absence,
cancel.clone(),
DeclareScope::SingleObjectScope("order".into()),
);
println!("Absence constraint (unary, negative):");
println!(
" template = {:?} (arity {})",
no_cancel.template,
no_cancel.template.arity()
);
println!(" activation = {:?}", no_cancel.activation);
println!(
" target = {:?} (always None for unary)",
no_cancel.target
);
println!(" is_negative? {}", no_cancel.template.is_negative());
println!();
let inner_response = DeclareConstraint::binary(
DeclareTemplate::Response,
submit.clone(),
approve.clone(),
DeclareScope::MultiObjectScope(vec!["order".into(), "customer".into()]),
);
let oc_response =
OcDeclareConstraint::new(inner_response, vec!["order".into(), "customer".into()]);
println!("OcDeclareConstraint (non-synchronized, multi-object):");
println!(" template = {:?}", oc_response.constraint.template);
println!(" object_types = {:?}", oc_response.object_types);
println!(" synchronized = {}", oc_response.is_synchronized());
println!(" validate() = {:?}", oc_response.validate());
println!();
let inner_succession = DeclareConstraint::binary(
DeclareTemplate::Succession,
ship.clone(),
deliver.clone(),
DeclareScope::SynchronizedObjectScope(vec!["order".into(), "delivery".into()]),
);
let oc_synchronized = OcDeclareConstraint::synchronized(
inner_succession,
vec!["order".into(), "delivery".into()],
);
println!("OcDeclareConstraint (synchronized, multi-object):");
println!(
" template = {:?}",
oc_synchronized.constraint.template
);
println!(" object_types = {:?}", oc_synchronized.object_types);
println!(" synchronized = {}", oc_synchronized.is_synchronized());
println!(" validate() = {:?}", oc_synchronized.validate());
println!();
let bad_inner = DeclareConstraint::unary(
DeclareTemplate::Existence,
submit.clone(),
DeclareScope::SingleObjectScope("order".into()),
);
let empty_oc = OcDeclareConstraint::new(bad_inner, vec![]);
let refusal = empty_oc.validate().unwrap_err();
println!("Refusal (EmptyObjectTypeList):");
println!(" {:?}", refusal);
println!(" Display: {}", refusal);
assert_eq!(refusal, OcDeclareRefusal::EmptyObjectTypeList);
println!();
let model: Vec<DeclareConstraint> = vec![
response.clone(),
precedence.clone(),
succession.clone(),
no_cancel.clone(),
];
println!("Composed model ({} constraints):", model.len());
for (i, c) in model.iter().enumerate() {
let target_label = c.target.as_ref().map(|t| t.0.as_str()).unwrap_or("—");
println!(
" [{i}] {:?}({}, {target_label}) negative={} chain={}",
c.template,
c.activation.0,
c.template.is_negative(),
c.template.is_chain(),
);
}
println!();
let sample_refusals = [
DeclareRefusal::MissingActivation,
DeclareRefusal::MissingTarget,
DeclareRefusal::InvalidTemplateArity,
DeclareRefusal::EmptyObjectScope,
DeclareRefusal::SynchronizationViolation,
];
println!("DeclareRefusal named laws:");
for r in &sample_refusals {
println!(" {}", r);
}
println!(
"\nDone. All constraint shapes are structure-only; graduate to wasm4pm for evaluation."
);
}