1use apollo_compiler::parser::FileId;
2use std::fmt::Display;
3use std::ops::Range;
4use std::sync::Arc;
5
6#[derive(Clone, Debug, Hash, PartialEq, Eq)]
13pub enum SourceId {
14 GraphQL(FileId),
16 Other(Arc<str>),
18}
19
20impl SourceId {
21 pub fn new(id: impl Into<Arc<str>>) -> Self {
22 Self::Other(id.into())
23 }
24
25 #[must_use]
27 pub fn location(&self, span: Range<usize>) -> Location {
28 Location {
29 source_id: self.clone(),
30 span,
31 }
32 }
33}
34
35#[derive(Clone, Debug, Hash, PartialEq, Eq)]
37pub struct Location {
38 pub source_id: SourceId,
40 pub span: Range<usize>,
42}
43
44#[derive(Clone, Debug, Hash, PartialEq, Eq)]
46pub struct Located<T> {
47 pub value: T,
48 pub locations: Vec<Location>,
49}
50
51impl<T> Located<T> {
52 pub fn new(value: T, locations: impl IntoIterator<Item = Location>) -> Self {
53 Self {
54 value,
55 locations: locations.into_iter().collect(),
56 }
57 }
58}
59
60impl<T: Display> Display for Located<T> {
61 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
62 write!(f, "{}", self.value)
63 }
64}