netlist_db/parser/
data_mc.rs

1use std::path::PathBuf;
2
3use super::{
4    BEGIN_TITLE,
5    utils::{name_str, space, space_newline},
6};
7use crate::{err::ParseError, span::LocatedSpan};
8use nom::{
9    IResult, Parser,
10    bytes::complete::{tag, take_until},
11    character::complete::char,
12    combinator::{map, opt},
13    multi::separated_list1,
14};
15use tokio::fs::read_to_string;
16
17#[inline]
18fn data_mc0_variation<'a>(i: LocatedSpan<'a>) -> IResult<LocatedSpan<'a>, Vec<String>> {
19    map(
20        (
21            take_until(BEGIN_TITLE),
22            take_until("\n"),
23            space_newline,
24            opt((tag("index"), space, char(','), space)),
25            separated_list1(
26                (space, char(','), space),
27                map(name_str, |(s, _)| String::from(s)),
28            ),
29        ),
30        |(_, _, _, _, variation)| variation,
31    )
32    .parse_complete(i)
33}
34
35#[inline]
36pub async fn data_mc0_variation_csv(path: PathBuf) -> Result<Vec<String>, ()> {
37    match read_to_string(&path).await {
38        Ok(s) => {
39            let (_, out) = data_mc0_variation(s.as_str().into()).map_err(|e| {
40                let err: ParseError = e.into();
41                err.report(&mut true, &crate::FileId::Include { path }, &s);
42            })?;
43            Ok(out)
44        }
45        Err(e) => {
46            let err: ParseError = e.into();
47            err.report(&mut true, &crate::FileId::Include { path }, "");
48            Err(())
49        }
50    }
51}
52
53#[tokio::test]
54async fn test_data_mc0_variation_csv() {
55    crate::utlis::test::init_logger();
56    _ = dbg!(
57        data_mc0_variation_csv("tests/sim.mc0.csv".into())
58            .await
59            .unwrap()
60    );
61}