Skip to main content

runmat_static_analysis/
schema.rs

1use std::collections::HashMap;
2use std::path::PathBuf;
3
4#[derive(Clone, Debug)]
5pub struct DatasetSchema {
6    pub arrays: HashMap<String, usize>,
7}
8
9pub trait DatasetSchemaProvider {
10    fn load_schema(&self, dataset_path: &str) -> Option<DatasetSchema>;
11}
12
13#[derive(Clone, Debug, Default)]
14pub struct FsDatasetSchemaProvider;
15
16impl DatasetSchemaProvider for FsDatasetSchemaProvider {
17    fn load_schema(&self, dataset_path: &str) -> Option<DatasetSchema> {
18        load_dataset_schema_from_fs(dataset_path)
19    }
20}
21
22pub fn load_dataset_schema_from_fs(dataset_path: &str) -> Option<DatasetSchema> {
23    let manifest_path = if dataset_path.ends_with(".json") {
24        PathBuf::from(dataset_path)
25    } else {
26        PathBuf::from(dataset_path).join("manifest.json")
27    };
28    let bytes = std::fs::read(&manifest_path).ok()?;
29    let value: serde_json::Value = serde_json::from_slice(&bytes).ok()?;
30    let arrays = value.get("arrays")?.as_object()?;
31    let mut out = HashMap::new();
32    for (name, meta) in arrays {
33        let shape = meta.get("shape")?.as_array()?;
34        out.insert(name.clone(), shape.len());
35    }
36    Some(DatasetSchema { arrays: out })
37}
38
39pub fn normalize_literal_string(text: &str) -> String {
40    if text.len() >= 2 {
41        let bytes = text.as_bytes();
42        if (bytes[0] == b'\'' && bytes[text.len() - 1] == b'\'')
43            || (bytes[0] == b'"' && bytes[text.len() - 1] == b'"')
44        {
45            return text[1..text.len() - 1].to_string();
46        }
47    }
48    text.to_string()
49}