use crate::builder::CanBeAddedToModel;
use crate::{BranchRule, Model, ProblemCreated};
pub struct BranchRuleBuilder<R: BranchRule> {
name: Option<String>,
desc: Option<String>,
priority: i32,
maxdepth: i32,
maxbounddist: f64,
rule: R,
}
impl<R: BranchRule> BranchRuleBuilder<R> {
pub fn new(rule: R) -> Self {
BranchRuleBuilder {
name: None,
desc: None,
priority: 100000,
maxdepth: -1,
maxbounddist: 1.0,
rule,
}
}
pub fn name(mut self, name: &str) -> Self {
self.name = Some(name.to_string());
self
}
pub fn desc(mut self, desc: &str) -> Self {
self.desc = Some(desc.to_string());
self
}
pub fn priority(mut self, priority: i32) -> Self {
self.priority = priority;
self
}
pub fn maxdepth(mut self, maxdepth: i32) -> Self {
self.maxdepth = maxdepth;
self
}
pub fn maxbounddist(mut self, maxbounddist: f64) -> Self {
self.maxbounddist = maxbounddist;
self
}
}
pub fn branchrule<R: BranchRule>(rule: R) -> BranchRuleBuilder<R> {
BranchRuleBuilder::new(rule)
}
impl<R: BranchRule + 'static> CanBeAddedToModel for BranchRuleBuilder<R> {
type Return = ();
fn add(self, model: &mut Model<ProblemCreated>) {
let name = self.name.unwrap_or_else(|| "".into());
let desc = self.desc.unwrap_or_else(|| "".into());
let rule_box = Box::new(self.rule);
model.include_branch_rule(
&name,
&desc,
self.priority,
self.maxdepth,
self.maxbounddist,
rule_box,
);
}
}
impl<R: BranchRule> From<R> for BranchRuleBuilder<R> {
fn from(rule: R) -> Self {
BranchRuleBuilder::new(rule)
}
}