stock-rust 0.1.0

Rust version of stock-api
Documentation
use anyhow::{anyhow, Result};

use crate::stocks::base::{COMMON_HK, COMMON_SH, COMMON_SZ, COMMON_US};

pub trait CommonCodeTransform {
    fn transform(&self, code: &str) -> Result<String>;

    fn transforms(&self, codes: &[String]) -> Result<Vec<String>> {
        codes.iter().map(|code| self.transform(code)).collect()
    }

    fn sz_transform(&self, _code: &str) -> Result<String> {
        Err(anyhow!("未实现深交所统一代码转换股票代码"))
    }

    fn sh_transform(&self, _code: &str) -> Result<String> {
        Err(anyhow!("未实现上交所统一代码转换股票代码"))
    }

    fn hk_transform(&self, _code: &str) -> Result<String> {
        Err(anyhow!("未实现港交所统一代码转换股票代码"))
    }

    fn us_transform(&self, _code: &str) -> Result<String> {
        Err(anyhow!("未实现美交所统一代码转换股票代码"))
    }
}

pub trait ApiCodeTransform {
    fn transform(&self, code: &str) -> Result<String>;

    fn transforms(&self, codes: &[String]) -> Result<Vec<String>> {
        codes.iter().map(|code| self.transform(code)).collect()
    }

    fn sz_transform(&self, _code: &str) -> Result<String> {
        Err(anyhow!("未实现深交所股票代码转换统一代码"))
    }

    fn sh_transform(&self, _code: &str) -> Result<String> {
        Err(anyhow!("未实现上交所股票代码转换统一代码"))
    }

    fn hk_transform(&self, _code: &str) -> Result<String> {
        Err(anyhow!("未实现港交所股票代码转换统一代码"))
    }

    fn us_transform(&self, _code: &str) -> Result<String> {
        Err(anyhow!("未实现美交所股票代码转换统一代码"))
    }
}

pub struct BaseCommonCodeTransform;

impl CommonCodeTransform for BaseCommonCodeTransform {
    fn transform(&self, code: &str) -> Result<String> {
        if code.starts_with(COMMON_SH) {
            return self.sh_transform(code);
        }
        if code.starts_with(COMMON_SZ) {
            return self.sz_transform(code);
        }
        if code.starts_with(COMMON_HK) {
            return self.hk_transform(code);
        }
        if code.starts_with(COMMON_US) {
            return self.us_transform(code);
        }

        Err(anyhow!("请检查统一代码是否正确"))
    }
}

pub struct BaseApiCodeTransform;

impl ApiCodeTransform for BaseApiCodeTransform {
    fn transform(&self, code: &str) -> Result<String> {
        if code.starts_with(COMMON_SH) {
            return self.sh_transform(code);
        }
        if code.starts_with(COMMON_SZ) {
            return self.sz_transform(code);
        }
        if code.starts_with(COMMON_HK) {
            return self.hk_transform(code);
        }
        if code.starts_with(COMMON_US) {
            return self.us_transform(code);
        }

        Err(anyhow!("请检查股票代码是否正确"))
    }
}