use super::{vector_to_array, AsVector, GraphMaker};
use num_traits::Num;
use std::fmt::Write;
pub struct FillBetween {
where_condition: String,
facecolor: String,
interpolate: bool,
extra: String,
buffer: String,
}
impl FillBetween {
pub fn new() -> Self {
FillBetween {
where_condition: String::new(),
facecolor: String::new(),
interpolate: false,
extra: String::new(),
buffer: String::new(),
}
}
pub fn draw<'a, T, U>(&mut self, x: &'a T, y1: &'a T, y2: Option<&'a T>)
where
T: AsVector<'a, U>,
U: 'a + std::fmt::Display + Num,
{
let opt = self.options();
vector_to_array(&mut self.buffer, "x", x);
vector_to_array(&mut self.buffer, "y1", y1);
match y2 {
Some(y2) => {
vector_to_array(&mut self.buffer, "y2", y2);
write!(&mut self.buffer, "plt.fill_between(x,y1,y2{})\n", &opt).unwrap();
}
None => {
write!(&mut self.buffer, "plt.fill_between(x,y1{})\n", &opt).unwrap();
}
}
}
pub fn set_where(&mut self, condition: &str) -> &mut Self {
self.where_condition = condition.to_string();
self
}
pub fn set_facecolor(&mut self, color: &str) -> &mut Self {
self.facecolor = color.to_string();
self
}
pub fn set_interpolate(&mut self, interpolate: bool) -> &mut Self {
self.interpolate = interpolate;
self
}
pub fn set_extra(&mut self, extra: &str) -> &mut Self {
self.extra = extra.to_string();
self
}
fn options(&self) -> String {
let mut opt = String::new();
if self.facecolor != "" {
write!(&mut opt, ",facecolor='{}'", self.facecolor).unwrap();
}
if self.where_condition != "" {
write!(&mut opt, ",where={}", self.where_condition).unwrap();
}
if self.interpolate {
write!(&mut opt, ",interpolate=True").unwrap();
}
if self.extra != "" {
write!(&mut opt, ",{}", self.extra).unwrap();
}
opt
}
}
impl GraphMaker for FillBetween {
fn get_buffer<'a>(&'a self) -> &'a String {
&self.buffer
}
fn clear_buffer(&mut self) {
self.buffer.clear();
}
}
#[cfg(test)]
mod tests {
use super::FillBetween;
#[test]
fn new_works() {
let fill_between = FillBetween::new();
assert_eq!(fill_between.where_condition, "");
assert_eq!(fill_between.facecolor, "");
assert_eq!(fill_between.interpolate, false);
assert_eq!(fill_between.extra, "");
assert_eq!(fill_between.buffer.len(), 0);
}
}