circomspect_program_structure/program_library/
file_definition.rs1use 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}