runmat_static_analysis/
schema.rs1use 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}