aldrin_parser/
resolver.rs

1mod fs;
2mod memory;
3
4use std::io::Error;
5
6pub use fs::FilesystemResolver;
7pub use memory::MemoryResolver;
8
9pub trait Resolver {
10    fn main_schema(&self) -> SchemaFile<'_>;
11    fn resolve(&mut self, name: &str) -> Option<SchemaFile<'_>>;
12}
13
14impl<T: Resolver + ?Sized> Resolver for &mut T {
15    fn main_schema(&self) -> SchemaFile<'_> {
16        (**self).main_schema()
17    }
18
19    fn resolve(&mut self, name: &str) -> Option<SchemaFile<'_>> {
20        (**self).resolve(name)
21    }
22}
23
24impl<T: Resolver + ?Sized> Resolver for Box<T> {
25    fn main_schema(&self) -> SchemaFile<'_> {
26        (**self).main_schema()
27    }
28
29    fn resolve(&mut self, name: &str) -> Option<SchemaFile<'_>> {
30        (**self).resolve(name)
31    }
32}
33
34#[derive(Debug)]
35pub struct SchemaFile<'a> {
36    name: &'a str,
37    path: &'a str,
38    source: Result<&'a str, &'a Error>,
39}
40
41impl<'a> SchemaFile<'a> {
42    pub fn new<N, P, S>(name: &'a N, path: &'a P, source: Result<&'a S, &'a Error>) -> Self
43    where
44        N: AsRef<str> + ?Sized,
45        P: AsRef<str> + ?Sized,
46        S: AsRef<str> + ?Sized,
47    {
48        Self {
49            name: name.as_ref(),
50            path: path.as_ref(),
51            source: source.map(AsRef::as_ref),
52        }
53    }
54
55    pub fn with_source<N, P, S>(name: &'a N, path: &'a P, source: &'a S) -> Self
56    where
57        N: AsRef<str> + ?Sized,
58        P: AsRef<str> + ?Sized,
59        S: AsRef<str> + ?Sized,
60    {
61        Self::new(name, path, Ok(source))
62    }
63
64    pub fn with_error<N, P>(name: &'a N, path: &'a P, err: &'a Error) -> Self
65    where
66        N: AsRef<str> + ?Sized,
67        P: AsRef<str> + ?Sized,
68    {
69        Self::new(name, path, Err::<&str, _>(err))
70    }
71
72    pub fn name(&self) -> &'a str {
73        self.name
74    }
75
76    pub fn path(&self) -> &'a str {
77        self.path
78    }
79
80    pub fn source(&self) -> Result<&'a str, &'a Error> {
81        self.source
82    }
83}