#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SourceFile {
relative_path: String,
lines: Vec<String>,
}
impl SourceFile {
pub fn new(relative_path: &str, contents: &str) -> Self {
let contents = contents.strip_prefix('\u{feff}').unwrap_or(contents);
Self {
relative_path: relative_path.replace('\\', "/"),
lines: contents
.split('\n')
.map(|line| line.strip_suffix('\r').unwrap_or(line).to_string())
.collect(),
}
}
pub fn relative_path(&self) -> &str {
&self.relative_path
}
pub fn lines(&self) -> &[String] {
&self.lines
}
pub fn contents(&self) -> String {
self.lines.join(
"
",
)
}
pub fn is_empty(&self) -> bool {
self.lines.iter().all(|line| line.trim().is_empty())
}
}