aldrin_parser/
resolver.rs1mod 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}