circomspect_program_structure/program_library/
file_definition.rs

1use codespan_reporting::files::{Files, SimpleFiles};
2use std::{ops::Range, collections::HashSet};
3
4pub type FileSource = String;
5pub type FilePath = String;
6pub type FileID = usize;
7pub type FileLocation = Range<usize>;
8type FileStorage = SimpleFiles<FilePath, FileSource>;
9
10#[derive(Clone)]
11pub struct FileLibrary {
12    files: FileStorage,
13    user_inputs: HashSet<FileID>,
14}
15
16impl Default for FileLibrary {
17    fn default() -> Self {
18        FileLibrary { files: FileStorage::new(), user_inputs: HashSet::new() }
19    }
20}
21
22impl FileLibrary {
23    pub fn new() -> FileLibrary {
24        FileLibrary::default()
25    }
26    pub fn add_file(
27        &mut self,
28        file_name: FilePath,
29        file_source: FileSource,
30        is_user_input: bool,
31    ) -> FileID {
32        let file_id = self.get_mut_files().add(file_name, file_source);
33        if is_user_input {
34            self.user_inputs.insert(file_id);
35        }
36        file_id
37    }
38
39    pub fn get_line(&self, start: usize, file_id: FileID) -> Option<usize> {
40        self.files.line_index(file_id, start).map(|lines| lines + 1).ok()
41    }
42
43    pub fn to_storage(&self) -> &FileStorage {
44        self.get_files()
45    }
46
47    pub fn user_inputs(&self) -> &HashSet<FileID> {
48        &self.user_inputs
49    }
50
51    pub fn is_user_input(&self, file_id: FileID) -> bool {
52        self.user_inputs.contains(&file_id)
53    }
54
55    fn get_files(&self) -> &FileStorage {
56        &self.files
57    }
58
59    fn get_mut_files(&mut self) -> &mut FileStorage {
60        &mut self.files
61    }
62}
63
64pub fn generate_file_location(start: usize, end: usize) -> FileLocation {
65    start..end
66}