1use std::borrow::Cow;
2
3#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
4pub struct Source<'c> {
5 pub source: Cow<'c, str>,
6 pub filename: Option<Cow<'c, str>>,
7}
8impl<'c> Source<'c> {
9 pub fn new(source: &'c str, filename: Option<&'c str>) -> Source<'c> {
10 Source {
11 source: Cow::from(source),
12 filename: filename.map(|filename| Cow::from(filename)),
13 }
14 }
15
16 pub fn without_filename<T: std::fmt::Display>(source: T) -> Source<'c> {
17 Source {
18 source: Cow::from(source.to_string()),
19 filename: None,
20 }
21 }
22
23 pub fn filename(&self) -> Option<String> {
24 self.filename.clone().map(String::from)
25 }
26}
27
28impl<'c> From<&'c str> for Source<'c> {
29 fn from(source: &'c str) -> Source<'c> {
30 Source::without_filename(source)
31 }
32}
33
34impl<'c> From<String> for Source<'c> {
35 fn from(source: String) -> Source<'c> {
36 Source::without_filename(source)
37 }
38}