use pine_builtin_macro::BuiltinFunction;
use pine_core::{Color, GlobalOutput, PineOutput};
use pine_interpreter::{Interpreter, RuntimeError, Value};
use std::collections::HashMap;
#[derive(BuiltinFunction)]
#[builtin(name = "bgcolor", output = GlobalOutput)]
struct Bgcolor {
#[arg(default = None)]
color: Option<Color>,
#[arg(default = "")]
title: String,
#[arg(default = None)]
transp: Option<f64>,
#[arg(default = None)]
offset: Option<f64>,
#[arg(default = false)]
editable: bool,
#[arg(default = "")]
display: String,
}
impl Bgcolor {
fn execute<O: PineOutput + GlobalOutput>(
&self,
ctx: &mut Interpreter<O>,
) -> Result<Value<O>, RuntimeError> {
let _ = (
&self.title,
self.transp,
self.offset,
self.editable,
&self.display,
);
ctx.output.set_bgcolor(self.color.clone());
Ok(Value::Na)
}
}
#[derive(BuiltinFunction)]
#[builtin(name = "barcolor", output = GlobalOutput)]
struct Barcolor {
#[arg(default = None)]
color: Option<Color>,
#[arg(default = "")]
title: String,
#[arg(default = None)]
offset: Option<f64>,
#[arg(default = false)]
editable: bool,
#[arg(default = "")]
display: String,
}
impl Barcolor {
fn execute<O: PineOutput + GlobalOutput>(
&self,
ctx: &mut Interpreter<O>,
) -> Result<Value<O>, RuntimeError> {
let _ = (&self.title, self.offset, self.editable, &self.display);
ctx.output.set_barcolor(self.color.clone());
Ok(Value::Na)
}
}
#[derive(BuiltinFunction)]
#[builtin(name = "max_bars_back")]
struct MaxBarsBack<O: PineOutput> {
var: Value<O>,
num: f64,
}
impl<O: PineOutput> MaxBarsBack<O> {
fn execute(&self, _ctx: &mut Interpreter<O>) -> Result<Value<O>, RuntimeError> {
let _ = (&self.var, self.num);
Ok(Value::Na)
}
}
pub fn register<O: PineOutput + GlobalOutput>() -> HashMap<String, Value<O>> {
let mut globals: HashMap<String, Value<O>> = HashMap::new();
globals.insert("bgcolor".to_string(), Bgcolor::builtin_value::<O>());
globals.insert("barcolor".to_string(), Barcolor::builtin_value::<O>());
globals.insert(
"max_bars_back".to_string(),
MaxBarsBack::<O>::builtin_value(),
);
globals.insert("bid".to_string(), Value::Na);
globals.insert("ask".to_string(), Value::Na);
globals
}