use codespan_reporting::files::{Error, Files, SimpleFile};
use std::ops::Range;
pub type FileId = usize;
#[derive(Debug, Default)]
pub struct Library(Vec<SimpleFile<String, &'static str>>);
impl Library {
pub fn new() -> Library {
Library(Vec::new())
}
pub fn add(&mut self, name: String, source: &'static str) -> usize {
let file_id = self.0.len();
self.0.push(SimpleFile::new(name, source));
file_id
}
pub fn get(&self, file_id: usize) -> Result<&SimpleFile<String, &'static str>, Error> {
self.0.get(file_id).ok_or(Error::FileMissing)
}
}
impl<'a> Files<'a> for Library {
type FileId = FileId;
type Name = String;
type Source = &'a str;
fn name(&self, file_id: usize) -> Result<String, Error> {
Ok(self.get(file_id)?.name().clone())
}
fn source(&self, file_id: usize) -> Result<&str, Error> {
Ok(self.get(file_id)?.source())
}
fn line_index(&self, file_id: usize, byte_index: usize) -> Result<usize, Error> {
self.get(file_id)?.line_index((), byte_index)
}
fn line_range(&self, file_id: usize, line_index: usize) -> Result<Range<usize>, Error> {
self.get(file_id)?.line_range((), line_index)
}
}