use crate::builder::CanBeAddedToModel;
use crate::{Model, Pricer, ProblemCreated};
pub struct PricerBuilder<P: Pricer> {
name: Option<String>,
desc: Option<String>,
priority: i32,
delay: bool,
pricer: P,
}
impl<P: Pricer> PricerBuilder<P> {
pub fn new(pricer: P) -> Self {
PricerBuilder {
name: None,
desc: None,
priority: 100000,
delay: false,
pricer,
}
}
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 delay(mut self, delay: bool) -> Self {
self.delay = delay;
self
}
}
pub fn pricer<P: Pricer>(pricer: P) -> PricerBuilder<P> {
PricerBuilder::new(pricer)
}
impl<P: Pricer + 'static> CanBeAddedToModel<ProblemCreated> for PricerBuilder<P> {
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 pricer_box = Box::new(self.pricer);
model.include_pricer(&name, &desc, self.priority, self.delay, pricer_box);
}
}