use std::{collections::HashMap, path::PathBuf};
use chrono::{DateTime, Utc};
use crate::{
BarEvent, Chart, Footprint, Iid, Manager, Share, Tic, TicEvent, TimeFrame,
};
use avin_utils::AvinError;
pub enum Asset {
SHARE(Share),
}
impl Asset {
pub fn new(s: &str) -> Result<Asset, AvinError> {
let iid = Manager::find_iid(s)?;
let share = Share::from_iid(iid);
let asset = Asset::SHARE(share);
Ok(asset)
}
pub fn from_iid(iid: Iid) -> Self {
assert!(iid.category() == "SHARE");
let share = Share::from_iid(iid);
Asset::SHARE(share)
}
#[allow(clippy::get_first)]
pub fn from_csv(line: &str) -> Result<Self, String> {
let parts: Vec<&str> = line.split(';').collect();
let exchange = parts.get(0).expect("invalid line");
let category = parts.get(1).expect("invalid line");
let ticker = parts.get(2).expect("invalid line");
let query = format!("{exchange}_{category}_{ticker}");
let result = Manager::find_iid(&query);
match result {
Ok(iid) => {
let asset = Asset::from_iid(iid);
Ok(asset)
}
Err(why) => {
let msg = format!("fail create from csv {line}, {why}");
Err(msg)
}
}
}
pub fn all_shares() -> Vec<Share> {
Share::all()
}
pub fn iid(&self) -> &Iid {
match self {
Self::SHARE(share) => share.iid(),
}
}
pub fn exchange(&self) -> &String {
match self {
Self::SHARE(share) => share.exchange(),
}
}
pub fn category(&self) -> &String {
match self {
Self::SHARE(share) => share.category(),
}
}
pub fn ticker(&self) -> &String {
match self {
Self::SHARE(share) => share.ticker(),
}
}
pub fn figi(&self) -> &String {
match self {
Self::SHARE(share) => share.figi(),
}
}
pub fn name(&self) -> &String {
match self {
Self::SHARE(share) => share.name(),
}
}
pub fn info(&self) -> &HashMap<String, String> {
match self {
Self::SHARE(share) => share.info(),
}
}
pub fn path(&self) -> PathBuf {
match self {
Self::SHARE(share) => share.path(),
}
}
pub fn chart(&self, tf: TimeFrame) -> Option<&Chart> {
match self {
Self::SHARE(share) => share.chart(tf),
}
}
pub fn chart_mut(&mut self, tf: TimeFrame) -> Option<&mut Chart> {
match self {
Self::SHARE(share) => share.chart_mut(tf),
}
}
pub fn load_chart(&mut self, tf: TimeFrame) -> Result<&Chart, AvinError> {
match self {
Self::SHARE(share) => share.load_chart(tf),
}
}
pub fn load_chart_mut(
&mut self,
tf: TimeFrame,
) -> Result<&mut Chart, AvinError> {
match self {
Self::SHARE(share) => share.load_chart_mut(tf),
}
}
pub fn load_chart_period(
&mut self,
tf: TimeFrame,
begin: DateTime<Utc>,
end: DateTime<Utc>,
) -> Result<&Chart, AvinError> {
match self {
Self::SHARE(share) => share.load_chart_period(tf, begin, end),
}
}
pub fn load_chart_empty(&mut self, tf: TimeFrame) -> &Chart {
match self {
Self::SHARE(share) => share.load_chart_empty(tf),
}
}
pub fn tics(&self) -> Option<&Vec<Tic>> {
match self {
Self::SHARE(share) => share.tics(),
}
}
pub fn footprint(&self, tf: TimeFrame) -> Option<&Footprint> {
match self {
Self::SHARE(share) => share.footprint(tf),
}
}
pub fn footprint_mut(
&mut self,
tf: &TimeFrame,
) -> Option<&mut Footprint> {
match self {
Asset::SHARE(share) => share.footprint_mut(tf),
}
}
pub fn load_tics(&mut self) -> Result<(), AvinError> {
match self {
Self::SHARE(share) => share.load_tics(),
}
}
pub fn build_footprint(
&mut self,
tf: TimeFrame,
) -> Result<(), AvinError> {
match self {
Self::SHARE(share) => share.build_footprint(tf),
}
}
pub fn delta_month(&self) -> Option<f64> {
let chart = self.chart(TimeFrame::Month)?;
let bar = chart.now()?;
let delta = bar.body().delta_p();
Some(delta)
}
pub fn delta_week(&self) -> Option<f64> {
let chart = self.chart(TimeFrame::Week)?;
let bar = chart.now()?;
let delta = bar.body().delta_p();
Some(delta)
}
pub fn delta_day(&self) -> Option<f64> {
let chart = self.chart(TimeFrame::Day)?;
let bar = chart.now()?;
let delta = bar.body().delta_p();
Some(delta)
}
pub fn delta_1h(&self) -> Option<f64> {
let chart = self.chart(TimeFrame::H1)?;
let bar = chart.now()?;
let delta = bar.body().delta_p();
Some(delta)
}
pub fn delta_10m(&self) -> Option<f64> {
let chart = self.chart(TimeFrame::M10)?;
let bar = chart.now()?;
let delta = bar.body().delta_p();
Some(delta)
}
pub fn delta_1m(&self) -> Option<f64> {
let chart = self.chart(TimeFrame::M1)?;
let bar = chart.now()?;
let delta = bar.body().delta_p();
Some(delta)
}
pub fn bar_event(&mut self, e: BarEvent) {
match self {
Self::SHARE(share) => share.bar_event(e),
}
}
pub fn tic_event(&mut self, _e: TicEvent) {
todo!();
}
pub fn clear(&mut self) {
match self {
Self::SHARE(s) => s.clear(),
}
}
}
impl std::fmt::Display for Asset {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
Self::SHARE(s) => write!(
f,
"Asset={}_{}_{}",
s.exchange(),
s.category(),
s.ticker()
),
}
}
}
impl PartialEq for Asset {
fn eq(&self, other: &Self) -> bool {
self.figi() == other.figi()
}
}