/*
 * Copyright (c), Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.
 */
pub mod operator;
pub mod om_op;

use serde::Deserialize;
use thiserror::Error;

// 自定义解析函数:将字符串解析为 f64(自动提取数字,忽略单位)
fn parse_micros_f64<'de, D>(deserializer: D) -> Result<f64, D::Error>
where
    D: serde::Deserializer<'de>,
{
    let s = String::deserialize(deserializer)?;
    if s.starts_with("N/A") { // 如果 csv 有 N/A, 返回-1,在之后的操作中会过滤掉负数的行
        return Ok(-1.0);
    }
    // 只保留数字、小数点、负号
    let cleaned: String = s
        .chars()
        .filter(|c| c.is_ascii_digit() || *c == '.' || *c == '-')
        .collect();

    if cleaned.is_empty() {
        return Err(serde::de::Error::custom("empty or invalid number"));
    }

    cleaned
        .parse::<f64>()
        .map_err(|_| serde::de::Error::custom("failed to parse as f64"))
}

#[derive(Error, Debug)]
pub enum ParseError {
    #[error("CSV format error: {0}")]
    CsvError(#[from] csv::Error),

    #[error("IO error: {0}")]
    IoError(#[from] std::io::Error),

    #[error("File is empty or has invalid data")]
    EmptyData,

    #[error("The format of file is invalid")]
    FormatError,
}