xsd_parser/parser/resolver/
file_resolver.rs

1use std::fs::File;
2use std::io::{BufReader, Error};
3
4use url::Url;
5
6use super::{ResolveRequest, Resolver};
7
8/// Implements a [`Resolver`] that can be used to load local files.
9#[must_use]
10#[derive(Default, Debug)]
11pub struct FileResolver;
12
13impl FileResolver {
14    /// Create a new [`FileResolver`] instance.
15    pub fn new() -> Self {
16        Self
17    }
18}
19
20impl Resolver for FileResolver {
21    type Buffer = BufReader<File>;
22    type Error = Error;
23
24    fn resolve(
25        &mut self,
26        req: &ResolveRequest,
27    ) -> Result<Option<(Url, Self::Buffer)>, Self::Error> {
28        let url = if let Some(current) = &req.current_location {
29            current.join(&req.requested_location)
30        } else {
31            Url::parse(&req.requested_location)
32        };
33
34        let Ok(url) = url else {
35            return Ok(None);
36        };
37
38        let Ok(path) = url.to_file_path() else {
39            return Ok(None);
40        };
41
42        let file = File::open(&path)?;
43        let buffer = BufReader::new(file);
44
45        Ok(Some((url, buffer)))
46    }
47}